使用JAX-WS发布RESTful Web Service
JAX-WS的EA3版本或以JWSDP 2.0发布的JAX-WS都支持发布和使用RESTful Web Services。下面的示例将说明如何用JAX-WS发布一个RESTful Web Service。
JAX-WS的EA3版本或以JWSDP 2.0发布的JAX-WS都支持发布和使用RESTful Web Services。下面的示例将说明如何用JAX-WS发布一个RESTful Web Service。
用JAX-WS发布RESTful Web Service,首先要创建一个对javax.xml.ws.Provider<T>接口的实现。Provider接口是对标准终端实现类的另一种动态实现办法。它与javax.xml.ws类似。Dispatch接口用在客户端。你会注意到Provider<T>是一个生成类。它能用SOAP/HTTP绑定支持Provider<javax.xml.transform.Source>和Provider<javax.xml.soap.SOAPMessage>,或者用XML/HTTP绑定支持Provider<javax.activation.DataSource>和Provider<javax.xml.transform.Source>。当创建Provider的实现时,你可以选择处理哪种形式的请求与响应消息。
我们要创建的示例Web服务非常简单,它把两个数相加然后返回结果,而我们将在Provider实现中使用Provider<Source>以及XML/HTTP绑定。首先,我们写一个AddNumbers Provider的实现来声明AddNumbers类。
public class AddNumbersImpl implements Provider
{}
接下来,声明@Resource标记,它被用来在JAX-WS 运行时注射WebServiceContext到我们的AddNumbersImpl 实例中。
public class AddNumbersImpl implements Provider {
@Resource
protected WebServiceContext wsContext;
}
下一步是实现T Provider.invoke(T request)方法。我们首先写出下面的方法声明,它是一个简单的try-catch块用来处理异常。注意,该方法以一个Source对象为请求,并返回一个Source对象作为响应。这符合我们创建的Provider类型。
public class AddNumbersImpl implements Provider {
@Resource
protected WebServiceContext wsContext;
public Source invoke(Source request) {
try {
} catch(Exception e) {
e.printStackTrace();
throw new HTTPException(500);
}
}
}
在本例中,AddNumbers Web服务将通过从URL路径或HTTP请求中抽取要相加的数字来获得请求。请求字符串和路径字符串可以从MessageContext中获取,而它又从WebServiceContext wsContext中获得,它会被注射到我们的AddNumbers对象中。下面的代码背用来从URL中获取PATH_INFO并检查看它是否是合适的格式。
String path = (String)mc.get(MessageContext.PATH_INFO);
if (path != null && path.contains("/num1") &&
path.contains("/num2")) {
return createResultSource(path);
}
createResultSource(String str)方法只从合适的被格式化的MessageContext.PATH_INFO字符串中创建Source对象。它从路径中抽取要相加的数字,然后把它们相加并调用createResultSource(int sum)方法。下面是这两个方法的源代码:
private Source createResultSource(String str) {
StringTokenizer st = new StringTokenizer(str, "=&/");
String token = st.nextToken();
int number1 = Integer.parseInt(st.nextToken());
st.nextToken();
int number2 = Integer.parseInt(st.nextToken());
int sum = number1+number2;
return createResultSource(sum);
}
private Source createResultSource(int sum) {
String body =
"<ns:addNumbersResponse xmlns:ns=\"http://duke.org\"><ns:return>"
+sum
+"</ns:return></ns:addNumbersResponse>";
Source source = new StreamSource(
new ByteArrayInputStream(body.getBytes()));
return source;
}
- 本文关键词:

