Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc Spring MVC 3.2-XStreamAlias被忽略_Spring Mvc_Xstream - Fatal编程技术网

Spring mvc Spring MVC 3.2-XStreamAlias被忽略

Spring mvc Spring MVC 3.2-XStreamAlias被忽略,spring-mvc,xstream,Spring Mvc,Xstream,Person.java: @XStreamAlias("person") public class Person { @XStreamAlias("id") private Long personProfileId; private String lastName; private String firstName; private String middleName; private String nameSuffix; private

Person.java:

@XStreamAlias("person")
public class Person {
    @XStreamAlias("id")
    private Long personProfileId;
    private String lastName;
    private String firstName;
    private String middleName;
    private String nameSuffix;
    private String namePrefix;

    // etc ...
}
<property name="defaultViews">
    <list>
        <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
            <constructor-arg>
                <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                    <property name="annotatedClasses">
                        <array>
                            <value>com.example.myapp.model.Person</value>
                        </array>
                    </property></bean>
            </constructor-arg>
        </bean>
    </list>
</property>
弹簧配置:

<bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="true" />
    <property name="ignoreAcceptHeader" value="true" />
    <property name="useJaf" value="false" />
    <property name="defaultContentType" value="application/xml" />

    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </map>
    </property>
</bean>

<bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1" />
    <property name="contentNegotiationManager" ref="contentNegotiationManager" />

    <property name="defaultViews">
        <list>
            <bean
            class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                <constructor-arg>
                    <bean class="org.springframework.oxm.xstream.XStreamMarshaller" />
                </constructor-arg>
            </bean>
        </list>
    </property>
</bean>

<mvc:annotation-driven
    content-negotiation-manager="contentNegotiationManager" />
<property name="defaultViews">
    <list>
        <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
            <constructor-arg>
                <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                    <property name="annotatedClasses">
                        <array>
                            <value>com.example.myapp.model.Person</value>
                        </array>
                    </property></bean>
            </constructor-arg>
        </bean>
    </list>
</property>

调用返回:

<property name="defaultViews">
    <list>
        <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
            <constructor-arg>
                <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                    <property name="annotatedClasses">
                        <array>
                            <value>com.example.myapp.model.Person</value>
                        </array>
                    </property></bean>
            </constructor-arg>
        </bean>
    </list>
</property>

1.
麦卡特尼
詹姆斯
保罗
2.
列侬
约翰
温斯顿
3.
斯塔基
理查德
4.
哈里森
乔治
我希望它能回来:

<?xml version="1.0" encoding="UTF-8"?>
<list>
<Person>
    <id>1</id>
    <lastName>McCartney</lastName>
    <firstName>James</firstName>
    <middleName>Paul</middleName>
</Person>
<Person>
    <id>2</id>
    <lastName>Lennon</lastName>
    <firstName>John</firstName>
    <middleName>Winston</middleName>
</Person>
<Person>
    <id>3</id>
    <lastName>Starkey</lastName>
    <firstName>Richard</firstName>
</Person>
<Person>
    <id>4</id>
    <lastName>Harrison</lastName>
    <firstName>George</firstName>
</Person>
</list>
<property name="defaultViews">
    <list>
        <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
            <constructor-arg>
                <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                    <property name="annotatedClasses">
                        <array>
                            <value>com.example.myapp.model.Person</value>
                        </array>
                    </property></bean>
            </constructor-arg>
        </bean>
    </list>
</property>

1.
麦卡特尼
詹姆斯
保罗
2.
列侬
约翰
温斯顿
3.
斯塔基
理查德
4.
哈里森
乔治

似乎调用XStream将对象转换为XML是正确的,但是忽略了@XStreamAlias注释。是否需要进一步配置才能使其正常工作?

解决了这个问题。带注释的类需要显式地标识给XStreamMarshaller

<property name="defaultViews">
    <list>
        <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
            <constructor-arg>
                <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                    <property name="annotatedClasses">
                        <array>
                            <value>com.example.myapp.model.Person</value>
                        </array>
                    </property></bean>
            </constructor-arg>
        </bean>
    </list>
</property>

<property name="defaultViews">
    <list>
        <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
            <constructor-arg>
                <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                    <property name="annotatedClasses">
                        <array>
                            <value>com.example.myapp.model.Person</value>
                        </array>
                    </property></bean>
            </constructor-arg>
        </bean>
    </list>
</property>

com.example.myapp.model.Person

我试图解决同样的问题(尽管是在Spring Boot项目中),并找到了另一个选择:
自动检测旋转

<property name="defaultViews">
    <list>
        <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
            <constructor-arg>
                <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                    <property name="annotatedClasses">
                        <array>
                            <value>com.example.myapp.model.Person</value>
                        </array>
                    </property></bean>
            </constructor-arg>
        </bean>
    </list>
</property>
xstreamMarshaller.setAutodetectAnnotations(true);

,将上述行添加到Application.java

根据XStream文档
<property name="defaultViews">
    <list>
        <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
            <constructor-arg>
                <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                    <property name="annotatedClasses">
                        <array>
                            <value>com.example.myapp.model.Person</value>
                        </array>
                    </property></bean>
            </constructor-arg>
        </bean>
    </list>
</property>
您必须使用
xstream.processAnnotations(MyPOJO.class)

您不也希望元素是元素吗?同样,XStream().setAutodetectAnnotations(true)也可以工作(对于非Spring项目)。
<property name="defaultViews">
    <list>
        <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
            <constructor-arg>
                <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                    <property name="annotatedClasses">
                        <array>
                            <value>com.example.myapp.model.Person</value>
                        </array>
                    </property></bean>
            </constructor-arg>
        </bean>
    </list>
</property>