【问题标题】:Spring MVC - set JAXB marshaller property when using @ResponseBodySpring MVC - 使用 @ResponseBody 时设置 JAXB 编组器属性
【发布时间】:2014-03-14 23:17:43
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

    标签: java spring spring-mvc jaxb moxy


    【解决方案1】:

    如果您需要自定义编组器,创建编组视图并使用您需要的属性配置编组器,这是配置 JAXB 编组器的示例(请参阅此answer):

    <!-- 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"/>
    

    【讨论】:

      【解决方案2】:

      您需要实现自己的AbstractJaxb2HttpMessageConverter 类并覆盖其createMarshaller 方法以提供具有您自己的属性的Marshaller。查看Jaxb2RootElementHttpMessageConverter 以获取实现提示。

      一旦你实现了这样一个类,你需要将它注册为一个HttpMessageConverter 到你的 MVC 堆栈中。如果您通过 Java 进行配置,请查看 WebMvcConfigurationSupport#configureMessageConverters(..)。如果您是通过 XML 进行的,请查看

      <mvc:annotation-driven>
          <mvc:message-converters>
              <!-- bean goes here -->
          </mvc:message-converters>
      </mvc:annotation-driven>
      

      【讨论】:

        【解决方案3】:

        就像 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" />
        

        【讨论】:

        • 这是引导 Spring 的老方法。这两个 bean 类都已弃用。
        • 您需要WebBindingInitializer 做什么?
        猜你喜欢
        • 1970-01-01
        • 2014-10-21
        • 2011-05-27
        • 2013-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多