Spring MVC - 使用 @ResponseBody 时设置 JAXB 编组器属性



我正在尝试从我的控制器返回一个对象,该对象应该在 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"/>

最新更新