Spring集成Restlet实践

本文详细介绍了如何在Spring框架中集成Restlet,从基本使用到进阶技巧,包括路径映射、参数传递和非字符串类型返回值的处理。在基本使用部分,展示了RestletServlet的配置以及SpringComponent和SpringRouter的设置。在进阶学习中,讨论了如何通过路径参数传递值,并以返回XML数据为例展示了返回非字符串类型数据的方法。同时,文章提出了几个遗留问题,如如何避免处理类膨胀、根节点配置的其他方式、配置文件名称自定义及ServerResource的scope配置原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring集成Restlet实践

3.1 基本使用

  采用Spring3.0和Restlet2.0.6,通过一个叫做RestletServlet的servlet与spring集成,如下:
<servlet>
    <servlet-name>RestletServlet</servlet-name>  
<servlet-class>org.restlet.ext.spring.RestletFrameworkServlet</servlet-class>
    <init-param>
      <param-name>org.restlet.component</param-name>
      <param-value>restletComponent</param-value>
  </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>RestletServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>


    要注意的是,如果直接使用restlet,则只要org.restlet.jar,如果需要与spring集成,则需要一系列org.restlet.ext.*.jar的配合。上述配置涉及到一个初始化参数(org.restlet.component),其值要求是一个bean,该bean默认配置到RestletServlet-servlet.xml文件中,配置如下:
 <bean id="restletComponent" class="org.restlet.ext.spring.SpringComponent"> 
       <property name="defaultTarget" ref="root" /> 
</bean>
  此处又涉及到一个叫做root的bean,该bean表示rest结构的path配置的根节点,在这个节点中,允许用户配置多个自己的路由地址,例子如下:
    <bean id="root" class="org.restlet.ext.spring.SpringRouter"> 
        <property name="attachments"> 
             <map> 
                <entry key="/newtest"> 
                     <bean class="org.restlet.ext.spring.SpringFinder"> 
                         <lookup-method name="create" bean="dtsResourceTest" /> 
                     </bean> 
                </entry>
    上面这个配置中,一个entry代表一个路径映射关系,key表示路径,里面的bean是路径对应的处理类,lookup-method name="create"暂时不清楚其作用。Bean的定义如下所示,它依然允许注入其他的bean,路径对应的处理方法通过在bean中的@Get注解来指定
<bean id="dtsResourceTest" class="com.dts.resource.DTSResourceTest" scope="prototype">
  <property name="issueService" ref="issueService"></property>
</bean>
注意:

        1、此处的bean都需要配置为原型模式:scope="prototype" Bean的定义需继承自ServerResource,如下:public class DTSResourceUpdate extends ServerResource
        2、如果servlet拦截的url匹配规则为/rest/*,root这边配置的是/newtest,则真正的访问地址应该为/rest/newtest,也就是说map这边的配置,是拦截后剩余的地址

 

3.2 进阶学习

3.2.1 路径映射如何传值
<entry key="/update/Defect/{number}"> 
  <bean class="org.restlet.ext.spring.SpringFinder"> 
  <lookup-method name="create" bean="dtsResourceUpdate" /> 
    </bean> 
</entry>
在path路径中,通过大括号来指明形参名和参数值,如/update/Defect/101,效果等价于在url中带入参数:http://..../Defect?number=101参数的获取方式如下:
@Get
 public String updateInfo(){
  String number = (String)
  getRequestAttributes().get("number");

 

 

3.3 如何返回非String类型的返回值

  Restlet通常当做轻量级的webservice使用,那如何返回较大的数据量呢?此处以xml为例:
return new StringRepresentation(getXmlIssueDTSManager().getIssueDtsFromXML());
其中,getIssueDtsFromXML()如下:
String xmlResult = "";
SAXBuilder builder=new SAXBuilder();
try {
 Document docment = builder.build(this.getClass().getResource("/").getPath()+File.separator+getDtsXMLFileName()+".xml");
 Format format = Format.getPrettyFormat();
 format.setIndent(" ");
 format.setEncoding("gb2312");
 XMLOutputter xmlOut = new XMLOutputter();
 xmlOut.setFormat(format);
 xmlResult = xmlOut.outputString(docment);
......
return xmlResult;

 


3.4 遗留问题

 
3.4.1 如何让一个ServerResource处理类的每个方法对应一个path?
  目前通过@Get注解,肯定无法区分方法与path的对应关系。如果一个类只能有一个方法对应一个path,那path较多的情况下,会导致处理类膨胀
3.4.2 根节点(SpringRouter)的配置是否有其他方式?
3.4.3 默认使用RestletServlet-servlet.xml作为配置文件的名称,如何自定义?
3.4.4 为什么ServerResource处理类的bean都要配置为scope="prototype"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值