『阿男的RESTEasy开发日记』*01*RESTEasy的WADL模块使用方法

视频: 『阿男的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

你可能感兴趣的:(java,xml,REST,resteasy,WADL)