当前位置: 首页 > 面试题库 >

Spring RESTful客户端:根标记异常

穆远
2023-03-14
问题内容

我正在尝试根据此示例http://thekspace.com/home/component/content/article/57-restful-
clients-in-
spring-3.html

使用RestTemplate解析RESTFull调用的结果

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

问题答案:

编辑:更新为仅包含有关信息

最好有不同的类来处理“品牌”和“品牌”标签。我将创建一个Brand类,将其重命名BrandListBrands(以使其更接近它们所引用的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>

我创建了一个示例项目,在其中验证设置。



 类似资料:
  • 我们目前正在使用grpc starter包实现一个高吞吐量的spring boot应用程序https://github.com/yidongnan/grpc-spring-boot-starter,这是一个基于客户机-服务器的应用程序。我们正在将遗留的RESTendpointCRUD操作迁移到GRPC。为了获得此服务的最佳设计,我们需要以下问题的帮助: > 如果单个不可变GRPC阻塞存根客户端实例

  • 0927,美团二面,1h 1. 自我介绍 2. 深挖项目 1. SwiftUI 怎么样,和 UIKit 比如何,你是怎么学的 Swift,有没有做方案的选型 2. 动画如何实现(自己瞎掰头,他说差不多是这个意思) 3. 序列化怎么做的 4. 网络库用的什么 5. iOS 这边 MVVM,APNs 怎么做的 3. 有没有了解过一些其他的移动端框架,Flutter 画点粒度做 UI 4. 实验室项目

  • 授权服务器颁发给已注册客户端客户端标识——一个代表客户端提供的注册信息的唯一字符串。客户端标识不是一个秘密,它暴露给资源所有者并且不能单独用于客户端身份验证。客户端标识对于授权服务器是唯一的。 客户端的字符串大小本规范未定义。客户端应该避免对标识大小做假设。授权服务器应记录其发放的任何标识的大小。

  • 更改标题栏标题 Tida.setTitle("页面名称"); 隐藏标题栏/全屏 Tida.hideTitle(); 显示标题栏 Tida.showTitle();

  • 问题内容: 我正在使用php,mysql进行搜索,过滤操作。 我的分页课程是 我已经使用以下复选框执行了过滤器: 过滤器的Javascript / ajax代码 process.php文件 我返回分页的结果,但是当我单击页码时,将我带到process.php,因为分页类使用 $ _SERVER [PHP_SELF] 如何在不更改页面url的情况下对结果进行分页,即使用ajax实施。我不能做太多更改

  • 在构建Retor Netty应用程序时,我得到了两个相似的指标。但是它们之间到底有什么区别呢? vs. 我不知道他们在测量响应时间的方式/位置上有什么不同。哪种方法测量的时间更长并不一致。 Http客户端指标测量时间更长 ReactorNetty指标延长了时间