Spring RESTful客户端:根标签异常[英] Spring RESTful client: root tag exception

问题描述

我正在尝试按照此示例使用 RestTemplate 解析 RESTFull 调用的结果 http://thekspace.com/home/component/content/article/57-restful-clients-in-spring-3.html

XML 响应是这样的:

<brands>
    <brand>
        <nodeRef>1111111</nodeRef>
        <name>Test</name>
    </brand>
</brands>

首先,我像这样配置了我的 application-context.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <property name="messageConverters">
            <list>
                <bean id="messageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                    <property name="marshaller" ref="xstreamMarshaller" />
                    <property name="unmarshaller" ref="xstreamMarshaller" />
                </bean>
            </list>
        </property>
    </bean>

    <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="aliases">
            <props>
                <prop key="brand">com.kipcast.dataModel.drugs.bean.BrandViewList</prop>
            </props>
        </property>
    </bean>


</beans>

com.kipcast.dataModel.drugs.bean.BrandViewList 类是一个定义了 @XStreamAlias("brand") 的 bean.

这里是我如何进行其余电话的:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-context.xml", WebscriptCaller.class); 
RestTemplate restTemplate = applicationContext.getBean("restTemplate", RestTemplate.class);     

String url = "http://localhost:8081/alfresco/service/search/brand.xml?q={keyword}&alf_ticket={ticket}"; 
List<BrandViewList> results = (List<BrandViewList>) restTemplate.getForObject(url, List.class, params);

WebscriptCaller.class 是我从中执行这些指令的类.

当我尝试执行该操作时,getForObject() 失败并出现异常:

XStream unmarshalling exception; nested exception is com.thoughtworks.xstream.mapper.CannotResolveClassException: brands

我的问题是,我该如何解决?为什么我会得到这种异常?我怎样才能告诉他跳过根标签?

--------------更新--------------
修复了一些问题,特别是:

List<Brand> brandViewList = (List<Brand>) restTemplate.getForObject(url, Brand.class, params);

但现在的结果是:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read [class com.kipcast.dataModel.drugs.bean.Brand]; nested exception is org.springframework.oxm.UnmarshallingFailureException: XStream unmarshalling exception; nested exception is com.thoughtworks.xstream.converters.ConversionException: nodeRef : nodeRef
---- Debugging information ----
message             : nodeRef
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : nodeRef
class               : java.util.ArrayList
required-type       : java.util.ArrayList
converter-type      : com.thoughtworks.xstream.converters.collections.CollectionConverter
path                : /brands/brand/nodeRef
line number         : 3
class[1]            : com.kipcast.dataModel.drugs.bean.Brands
converter-type[1]   : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
version             : null
-------------------------------

推荐答案

EDIT: 更新为仅包含相关信息

最好有不同的类来处理"品牌"和"品牌"标签.我将创建一个 Brand 类,将 BrandList 重命名为 Brands(以更接近它们所引用的 XML 部分),并让 Brands 容纳一个 List<Brand>.为两个类添加适当的注释,您应该完成,例如:

@XStreamAlias("brands")
class Brands {
  @XStreamImplicit
  List<Brand> brand;
}

@XStreamAlias("brand")
class Brand {
  String nodeRef;
  String name;
}

上述代码在将对象编组为 XML 时完美运行,但在从 XML 解组为对象时如您所描述的那样失败.为了使其正常工作,您需要告诉编组器您拥有哪些带注释的类:

<bean name="marshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
    <property name="autodetectAnnotations" value="true"/>
    <property name="annotatedClasses">
        <array>
            <value>com.kipcast.dataModel.drugs.bean.BrandViewList</value>
            <value>com.kipcast.dataModel.drugs.bean.BrandView</value>
        </array>
    </property>
</bean>

我创建了一个 示例项目,用于验证设置.

其他推荐答案

我用ArrayList类型解决了这个问题.所以不需要使用假类来处理列表.它对我有用(没有使用任何注释):

<bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
    <property name="aliases">
        <props>
            <prop key="brands">java.util.ArrayList</prop>
            <prop key="brand">com.kipcast.dataModel.drugs.bean.BrandView</prop>
        </props>
    </property>
</bean>

本文地址:https://www.itbaoku.cn/post/978575.html