我正在尝试从我的控制器返回一个对象,该对象应该在 spring 之前解析为 xml。但是我在类中使用了@XmlNamedObjectGraph(来自 moxy eclipselink)注释来自定义返回的对象。所以我必须从编组器设置属性MarshallerProperties.OBJECT_GRAPH。
如何在控制器中访问 spring 用来解析对象的编组器?
即:
@RequestMapping(value = "/xml/", method = RequestMethod.GET, produces = "application/xml")
@ResponseBody
public ResponseEntity<Customer> getXml() {
Customer customer = _customerService.getById(12);
...
marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "default");
...
return new ResponseEntity<>(customer, HttpStatus.OK);
}
提前感谢您的帮助。
就像Sotirios Delimanolis说的那样。你必须实现你自己的AbstractJaxb2HttpMessageConverter
.但除此之外,您还实现了WebBindingInitializer
并将其注册到:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="com.example.CommonWebBindingInitializer" />
</property>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
<bean class="com.example.Jaxb2RootElementHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
实现自己的AbstractJaxb2HttpMessageConverter
类并重写其createMarshaller
方法,以提供具有您自己的属性的Marshaller
。查看Jaxb2RootElementHttpMessageConverter
以实现提示。
实现此类后,需要将其注册为 MVC 堆栈的HttpMessageConverter
。如果您通过 Java 进行配置,请查看WebMvcConfigurationSupport#configureMessageConverters(..)
。如果您通过 XML 执行此操作,请查看
<mvc:annotation-driven>
<mvc:message-converters>
<!-- bean goes here -->
</mvc:message-converters>
</mvc:annotation-driven>
如果需要定制编组器、创建编组视图并使用所需的属性配置编组器,下面是配置 JAXB 编组器的示例(请参阅此答案):
<!-- XML view using a JAXB marshaller -->
<bean id="jaxbView" class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.company.AClass</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
<!-- Resolve views based on string names -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>