Jackson POJOPropertyBuilder在POJO中找到多个setter

时间:2015-01-22 16:02:08

标签: java spring-mvc jackson swagger

我们正在使用Spring Web MVC 3.2.2和Jackson Databind 2.4.4(以及许多其他库中......)开发一个相当大的JSON REST API。

我正在尝试使用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”只是一个例子,在没有包含属性年份的类的情况下尝试相同。

奇怪的是,杰克逊选择了两次完全相同的方法/设定者: javax.xml.datatype.XMLGregorianCalendar#setYear(1 params) vs javax.xml.datatype.XMLGregorianCalendar#setYear(1 params

我花了一些时间在调试器上,注意到一些DTO似乎通过检查冲突的setter就好了。

我现在花了很多时间来解决这个问题,但却无法提出解决方案。我在谷歌发现的这个例外的大多数页面都谈到了重载的方法/设置器,这与我的DTO不同 - 它们只是简单的对象,只有属性,设置器和getter。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:9)

问题是XMLGregorianCalendar有两个setYear方法:setYear(int year)setYear(BigDecimal year)。您需要告诉swagger忽略其中一个,您可以为XMLGregorianCalendar配置mixin以仅使用getter(类似this)。如果XMLGregorianCalendar仅用于返回值的上下文中,那么这将起作用。

如果不是这种情况,您可以使用directModelSubstitute option设置替换类型。当您配置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文档中表示的类型,您可以ignore the type as well