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。
我们正在使用 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。