Jackson POJOPropertyBuilder 在 POJO 中找到多个 setter

Jackson POJOPropertyBuilder finds multiple setters in POJO

我们正在使用 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"只是一个例子,没有包含属性年份的class也试过了。

奇怪的是 Jackson 两次找到完全相同的方法/setter: javax.xml.datatype.XMLGregorianCalendar#setYear(1 params) 对比 javax.xml.datatype.XMLGregorianCalendar#setYear(1 params

我花了一些时间在调试器上,发现一些 DTO 似乎通过了冲突 setters 的检查。

我现在已经在这上面花了很多时间,但无法提出解决方案。我在 Google 中发现的大多数关于此异常的页面都在谈论重载方法/setter,而我的 DTO 并非如此——它们只是简单的对象,只有属性,setter s 和吸气剂。

如有任何帮助,我们将不胜感激!

问题是 XMLGregorianCalendar 有两个 setYear 方法:setYear(int year)setYear(BigDecimal year)。你需要告诉swagger忽略其中一个,你可以配置一个mixin for the XMLGregorianCalendar to only use getters (something like this)。如果 XMLGregorianCalendar 仅在 return 值的上下文中使用,这将起作用。

如果不是这种情况,您可以使用 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