视频: 『阿男的RESTEasy开发日记』*01*RESTEasy的WADL模块使用方法
与Jersey相似,RESTEasy也有自己的WADL模块。RESTEasy的WADL模块设计为可配置的模块,支持多种容器。在这篇文章中,我们看一下RESTEasy的WADL模块的几种使用方法。
首先是RESTEasy的WADL模块在Servlet容器中的使用方法。我们可以把ResteasyWadlServlet注册进web.xml,然后把这个servlet映射到一个所需URL地址上即可:
<servlet>
<servlet-name>RESTEasy WADL</servlet-name>
<servlet-class>org.jboss.resteasy.wadl.ResteasyWadlServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RESTEasy WADL</servlet-name>
<url-pattern>/application.xml</url-pattern>
</servlet-mapping>
如上面的配置所示,当我们访问"/application.xml"这个地址的时候,我们就可以看到相关的WADL信息了。
此外,RESTEasy还支持Sun JDK HTTP Server,以下是WADL模块在Sun JDK HTTP Server中的使用方法:
com.sun.net.httpserver.HttpServer httpServer =
com.sun.net.httpserver.HttpServer.create(new InetSocketAddress(port), 10);
org.jboss.resteasy.plugins.server.sun.http.HttpContextBuilder contextBuilder =
new org.jboss.resteasy.plugins.server.sun.http.HttpContextBuilder();
contextBuilder.getDeployment().getActualResourceClasses()
.add(ResteasyWadlDefaultResource.class);
contextBuilder.bind(httpServer);
ResteasyWadlDefaultResource.getServices()
.put("/",
ResteasyWadlGenerator
.generateServiceRegistry(contextBuilder.getDeployment()));
httpServer.start();
从上面的代码中,可以看到需要把ResteasyWadlDefaultResource注册进服务器。
此外,在服务启动之前,我们需要生成WADL描述数据:
org.jboss.resteasy.wadl.ResteasyWadlGenerator
.generateServiceRegistry(contextBuilder.getDeployment()));
如果我们注册的resources在运行时有变动,则需要重新执行上述代码刷新WADL数据。
关于ResteasyWadlDefaultResource,它是一个默认的resource类,用于生成WADL数据,它的源代码如下:
package org.jboss.resteasy.wadl;
import org.jboss.resteasy.logging.Logger;
import org.jboss.resteasy.wadl.i18n.Messages;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.xml.bind.JAXBException;
import java.util.HashMap;
import java.util.Map;
/**
* @author <a href="mailto:[email protected]">Weinan Li</a>
*/
@Path("/application.xml")
public class ResteasyWadlDefaultResource {
private final static ResteasyWadlWriter apiWriter = new ResteasyWadlServletWriter();
private final static Map<String, ResteasyWadlServiceRegistry> services = new HashMap<>();
private final static Logger LOG = Logger.getLogger(ResteasyWadlDefaultResource.class);
public static Map<String, ResteasyWadlServiceRegistry> getServices() {
return services;
}
@GET
@Produces("application/xml")
public String output() {
try {
return this.apiWriter.getStringWriter("", services).toString();
} catch (JAXBException e) {
LOG.error(Messages.MESSAGES.cantProcessWadl(), e);
}
return null;
}
}
可以看到,这个resource默认映射到"/application.xml"这个url上。此外,它提供一个output方法用于处理GET请求,用于输出WADL数据,使用的也是ResteasyWadlWriter。output方法中的重点代码如下:
return this.apiWriter.getStringWriter("", services).toString();
最后我们来看看WADL模块在Netty Container当中的使用方法。WADL模块在Netty容器中的使用方法与Sun JDK HTTP Server非常类似,以下是示例代码:
ResteasyDeployment deployment = new ResteasyDeployment();
netty = new NettyJaxrsServer();
netty.setDeployment(deployment);
netty.setPort(port);
netty.setRootResourcePath("");
netty.setSecurityDomain(null);
netty.start();
deployment.getRegistry()
.addPerRequestResource(ResteasyWadlDefaultResource.class);
ResteasyWadlDefaultResource.getServices()
.put("/", ResteasyWadlGenerator.generateServiceRegistry(deployment));
WADL的注册代码仍然是这两行:
deployment.getRegistry()
.addPerRequestResource(ResteasyWadlDefaultResource.class);
ResteasyWadlDefaultResource.getServices()
.put("/", ResteasyWadlGenerator.generateServiceRegistry(deployment));
同样道理,如果在运行时resources发生改变,需要重新执行上面最后一行代码。
最后,我写了一个demo[1]放在了github上面,大家有兴趣可以自己玩玩看。
目前RESTEasy的这个WADL模块由我维护,大家在使用方面有什么问题欢迎提意见。
[1] https://github.com/liweinan/play-with-resteasy-wadl