1

Spring REST を使用していますが、HTTP リクエストから XML をアンマーシャリングしているときに次の例外が発生します。

例外: 例外: org.springframework.http.converter.HttpMessageNotReadableException: [クラス com.sample.beans.Address] を読み取れませんでした。ネストされた例外は org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; です。ネストされた例外は javax.xml.bind.UnmarshalException です - リンクされた例外: [org.xml.sax.SAXParseException: エンティティ名は、エンティティ参照の「&」の直後に続く必要があります。]

リクエスト XML では、「&」、「<」、「>」などの文字を渡しています。例: Andaman & Nicobar

コントローラ クラス:

@RequestMapping(method=RequestMethod.POST,value="v1/createuser/{user}", headers="Content-Type=application/xml")
@ResponseStatus(HttpStatus.CREATED)
public ModelAndView createUser(@RequestBody Address address,@PathVariable("user") String owner,HttpServletRequest request,HttpServletResponse response){
//code to store the address and return response in the form of xml
}

春サーブレット xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd">


<context:component-scan base-package="com.samples.controller" />

<!-- To enable @RequestMapping process on type level and method level -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

<!--  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />-->
<bean id="methodHandler" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="marshallConverter"/>
        </list>
    </property>
</bean>
<bean id="marshallConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
        <property name="marshaller" ref="jaxb2Marshaller" />
        <property name="unmarshaller" ref="jaxb2Marshaller" />
        <property name="supportedMediaTypes" value="application/xml" />
    </bean>


    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>com.sample.beans.Address</value>
              </list>
        </property>
    </bean>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" />

        <bean id="dsmPolicyRuleResponse" class="org.springframework.web.servlet.view.xml.MarshallingView">
                <constructor-arg ref="jaxb2Marshaller" />
        </bean>

</beans>

しかし、Andaman & Nicobar のようなものを渡すと、正常に動作します。しかし、リクエストで「&」、「>」、「<」などの特殊文字を処理する方法を見つける必要があります

4

1 に答える 1

3

JAXB Marshaller に次のプロパティを設定することにより、これを行います。

Spring Bean configuration: 

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshalle r">
    <description>
        The JAXB Marshaller is used by the sendToTargetRequest to (un)marshal XML to objects and vice-versa.
    </description>
    <property name="contextPath" value="xx.orders.types:xx.orders.functionalack"/>
    <property name="mtomEnabled" value="false"/>
    <property name="marshallerProperties">
        <map>
            <entry key="jaxb.encoding">
                <value>UTF-8</value>
            </entry>
        </map>
    </property>
</bean>
于 2013-08-29T12:44:01.960 に答える