Java 使用SpringMVC和自定义序列化程序的招摇过市

Java 使用SpringMVC和自定义序列化程序的招摇过市,java,json,spring-mvc,swagger,Java,Json,Spring Mvc,Swagger,我试图使用Swagger来记录基于SpringMVC的REST-API,但在使用Swagger来反映自定义序列化程序和反序列化程序时遇到了问题 由于JSON必须符合既定的格式(设计得不是特别好),并且我希望Java类中有一个正确设计的API模型,因此我使用了一些JsonSerializer的定制实现来生成JSON输出。当我在SpringMVC控制器中启用带注释的Swagger时,生成的文档将忽略自定义序列化程序,并将模型描述为使用默认Jackson设置进行序列化。到目前为止还不错,我真的没想到斯

我试图使用Swagger来记录基于SpringMVC的REST-API,但在使用Swagger来反映自定义序列化程序和反序列化程序时遇到了问题

由于JSON必须符合既定的格式(设计得不是特别好),并且我希望Java类中有一个正确设计的API模型,因此我使用了一些JsonSerializer的定制实现来生成JSON输出。当我在SpringMVC控制器中启用带注释的Swagger时,生成的文档将忽略自定义序列化程序,并将模型描述为使用默认Jackson设置进行序列化。到目前为止还不错,我真的没想到斯威格会自动理解序列化程序的实现

然而,我所期望的(我在Swagger文档中找不到任何关于这一点的内容)是在模型类的相关属性上使用Swagger注释来手动描述模型的方法。我是否遗漏了一些东西,或者在与自定义序列化程序(或反序列化程序)的连接中,我真的不可能作为一个文档工具大摇大摆


编辑:Swagger文档不是特别好,但我已经尝试过使用@ApiModelProperty处理偏差属性。据我所见,它对生成的输出绝对没有影响(使用Swagger SpringMVC 0.8.5和0.9.5进行测试)。

您可以使用模型替代,例如,假设您有一个服务

@RequestMapping(value={”/someresource},method=POST,
消费=应用程序\u JSON\u值,生产=应用程序\u JSON\u值)
@应答器
公共责任
businessTypeEcho(@RequestBody CustomSerializableResource business){
返回新的CustomSerializableResource();
}
您可以设置一个类型替换规则,告诉springmvc如何在swagger ui中表示自定义可序列化类型

@Bean//别忘了@Bean注释
公共炫耀SpringMVCPlugin customImplementation(){
返回新的SwaggerSpringMvcPlugin(this.springSwaggerConfig)
.apinfo(apinfo())
.directModelSubstitute(CustomSerializableResource.class,SubstitutedSerializableResource.class)
.includePatterns(“.*pet.”);
}
类替换的SerializableResource{
//描述什么的接受者和接受者
//CustomSerializableResource在UI中应该类似
}
不幸的是,这将创建一个运行时不使用的并行类型宇宙

更新: 如果我正确理解您的评论,那么您正在使用它格式化系统范围的类型,即布尔值为Y/N或日期为mm/dd/yyyy。在我看来,您可能正在寻找的是使用模型替代品(参见上面的示例)

  • 在日期的情况下,只能通过特定字段或属性的文本描述来传达预期格式
  • 用您可以创建的枚举替换
    Boolean
    ,即
    YesNoEnum
    ,该枚举表示您希望序列化对象的方式。这将为文档提供一组允许的值

一天结束时,创建这些元类只是为了编写文档,而不是标准化API模型以尽可能多地使用序列化原语。创建和维护数据模型的完整副本只是为了记录与默认序列化规则的一些偏差似乎不是一个好主意。我也不清楚mixin如何解决这个问题。根据您链接到的页面,它们可以用于将注释与模型类解耦,但我不清楚如何使用mixin(也不需要维护几乎相同的第二组类)你可以让Swagger在生成的文档中反映自定义序列化程序。你的问题中没有具体的例子。可能是需要自定义序列化的类型的具体示例。除了将注释与模型类解耦之外,mixin还可以通过注释(在某种程度上)影响json的形状。在任何情况下,库都无法推断客户序列化程序的效果。这个问题有什么不清楚的地方,需要一个具体的例子来理解它?使用专有日期格式序列化java.util.Date,或者使用字符串“yes”和“no”作为布尔值,这是我使用自定义序列化程序的两种特定情况。您的问题非常清楚。我只是想看看你是否有例子,这样我就可以建议最好的解决方案。用字符串或布尔值替换日期和YesNoEnum不幸地与我的要求相冲突,正如问题中所述:“我想在Java类中有一个正确设计的API模型”。为了使其变得不必要的复杂,已建立的JSON格式已经使用例如true/false(真布尔值)、“true”/“false”(字符串)和“yes”/“no”(字符串)来表示布尔值。在Java模型中为布尔值使用不同的数据类型也会造成混乱。