Jackson POJOPropertyBuilder在POJO中找到多个设置器
我们正在使用Spring Web MVC 3.2.2和Jackson Databind 2.4.4(还有许多其他库…)来开发相当大的JSON REST
API。
我正在尝试使用swagger-springmvc,但是我的一些DTO遇到了麻烦。
无论我使用简单@EnableSwagger
还是更为复杂的配置,启动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)vsjavax.xml.datatype.XMLGregorianCalendar#setYear(1 params
我花了一些时间在调试器上,发现一些DTO似乎通过了对设置程序冲突的检查。
我现在已经花了很多时间来解决这个问题。我在Google上发现的有关此异常的大多数页面都谈论重载的方法/设置器,而我的DTO却不是这种情况-
它们是简单的对象,仅包含属性,设置器和获取器。
任何帮助将不胜感激!
回答:
问题是XMLGregorianCalendar
有两种setYear
方法:setYear(int
year)和setYear(BigDecimal
year)。你需要告诉招摇忽视其中之一,你可以配置一个混入了XMLGregorianCalendar
只用干将(像这样)。如果仅在返回值的上下文中使用XMLGregorianCalendar,这将起作用。
如果不是这种情况,则可以使用directModelSubstitute
选项设置替代类型。配置后,SwaggerSpringMvcPlugin
您可以尝试以下选项之一
@Beanpublic 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文档中表示的类型,则也可以忽略该类型。
以上是 Jackson POJOPropertyBuilder在POJO中找到多个设置器 的全部内容, 来源链接: utcz.com/qa/417026.html