您的位置:首页 > 编程语言 > Java开发

Spring集成Restlet实践

2014-04-25 22:48 435 查看

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"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: