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

查看:19
本文介绍了Spring RESTful 客户端:根标记异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to parse the result from a RESTFull call using RestTemplate following this sample http://thekspace.com/home/component/content/article/57-restful-clients-in-spring-3.html

XML 响应是这样的:

The XML Response is something like that:

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

首先,我像这样配置了我的 application-context.xml:

For first, I configured my application-context.xml like that:

<?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.

The class com.kipcast.dataModel.drugs.bean.BrandViewList is a bean with an @XStreamAlias("brand") defined.

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

Here how I do the rest call:

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 是我从中执行这些指令的类.

WebscriptCaller.class is the class from which I execute these instructions.

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

When I try to execute that, the getForObject() fails and I get that exception:

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

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

My question is, how can I fix that? Why I get this kind of Exception? How can I tell him to skip root tag?

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

-------------- UPDATED --------------
fixed some issue and in particular:

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
-------------------------------

推荐答案

更新为仅包含相关信息

updated to contain only pertaining information

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

It's best if you have distinct classes handling "brands" and "brand" tags. I would create a Brand class, rename BrandList to Brands (to be closer to the XML parts they refer to), and let Brands hold a List<Brand>. Put the proper annotations to both classes and you should be done, e.g.:

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

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

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

The above code works perfectly when marshalling objects to XML, but fails as you describe when unmarshalling from XML to objects. For that to work fine, you need to tell the marshaller which annotated classes you have:

<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>

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

I created a sample project where I verify the setup.

这篇关于Spring RESTful 客户端:根标记异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆