我们正在使用 Spring Web MVC 3.2.2 和 Jackson Databind 2.4.4(以及许多其他库......)开发一个相当大的 JSON REST API。
我正在尝试使用swagger-springmvc https://github.com/martypitt/swagger-springmvc,但我的一些 DTO 遇到了麻烦。
无论我是否使用简单的@EnableSwagger
或者更复杂的 swagger 配置,启动 Tomcat 7 时我总是遇到以下异常:
java.lang.IllegalArgumentException: Conflicting setter definitions for property "year": javax.xml.datatype.XMLGregorianCalendar#setYear(1 params) vs javax.xml.datatype.XMLGregorianCalendar#setYear(1 params)
at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getSetter(POJOPropertyBuilder.java:303)
at com.mangofactory.swagger.models.Annotations.findPropertyAnnotation(Annotations.java:33)
at com.mangofactory.swagger.models.property.bean.BeanModelProperty.<init>(BeanModelProperty.java:26)
at com.mangofactory.swagger.models.property.bean.BeanModelPropertyProvider.beanModelProperty(BeanModelPropertyProvider.java:166) (...rest of stacktrace )
上面提到的属性“year”只是一个例子,在不包含属性year的类的情况下尝试相同的方法。
奇怪的是杰克逊两次找到了相同的方法/设置器:javax.xml.datatype.XMLGregorianCalendar#setYear(1 params)
vs javax.xml.datatype.XMLGregorianCalendar#setYear(1 params
我花了一些时间使用调试器,注意到一些 DTO 似乎很好地通过了冲突设置器的检查。
我现在花了很多时间在这个问题上,但无法想出解决方案。我在 Google 上找到的有关此异常的大多数页面都讨论了重载方法/设置器,而我的 DTO 则不是这样 - 它们是简单的对象,除了属性、设置器和获取器之外什么也没有。
任何帮助将不胜感激!
问题是XMLGregorianCalendar
有两个setYear
方法:setYear(int year)
and setYear(BigDecimal year)
。你需要告诉 swagger 忽略其中一个,你可以配置一个mixin http://wiki.fasterxml.com/JacksonMixInAnnotations为了XMLGregorianCalendar
只使用吸气剂(类似于this http://stairs-jumper.livejournal.com/33244.html)。如果 XMLGregorianCalendar 仅在返回值的上下文中使用,则这将起作用。
如果不是这种情况,您可以使用以下命令设置替换类型directModelSubstitute
option https://github.com/martypitt/swagger-springmvc/blob/master/swagger-springmvc/src/main/java/com/mangofactory/swagger/plugin/SwaggerSpringMvcPlugin.java#L284。当你配置时SwaggerSpringMvcPlugin
您可以尝试以下选项之一
@Bean
public SwaggerSpringMvcPlugin yourPlugin() {
...
plugin.directModelSubstitute(XMLGregorianCalendar.class, String.class)
//OR this, depending on how you intend to use it and how you want
// the serialized/deserialized types to appear on the swagger UI
plugin.directModelSubstitute(XMLGregorianCalendar.class, Date.class)
...
return plugin
}
或者,如果您不关心 API 文档中表示的类型,您可以也忽略类型 https://github.com/martypitt/swagger-springmvc#excluding-spring-handler-method-arguments-or-custom-types.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)