【发布时间】:2012-01-08 13:42:44
【问题描述】:
我的网络服务类如下:
package com.siemens.rest;
import java.io.ByteArrayInputStream;
import java.math.BigDecimal;
import javax.annotation.Resource;
import javax.servlet.ServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.BindingType;
import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.http.HTTPBinding;
import javax.xml.ws.http.HTTPException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
@WebServiceProvider
@BindingType(value = HTTPBinding.HTTP_BINDING)
public class ConverterService implements Provider<Source> {
/**
*
*/
private static final long serialVersionUID = 1L;
@Resource
protected WebServiceContext wsContext;
private BigDecimal rupeeRate = new BigDecimal("40.58");
private BigDecimal euroRate = new BigDecimal("0.018368");
public Source invoke(Source source) {
try {
String amount = null;
if (source == null) {
System.out.println("Getting input from query string");
MessageContext mc = wsContext.getMessageContext();
String query = (String) mc.get(MessageContext.QUERY_STRING);
System.out.println("Query String = " + query);
ServletRequest req = (ServletRequest) mc
.get(MessageContext.SERVLET_REQUEST);
amount = req.getParameter("amount");
} else {
System.out.println("Getting input from input message");
Node n = null;
if (source instanceof DOMSource) {
n = ((DOMSource) source).getNode();
} else if (source instanceof StreamSource) {
StreamSource streamSource = (StreamSource) source;
DocumentBuilderFactory dbf = DocumentBuilderFactory
.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource inputSource = null;
if (streamSource.getInputStream() != null) {
inputSource = new InputSource(
streamSource.getInputStream());
} else if (streamSource.getReader() != null) {
inputSource = new InputSource(streamSource.getReader());
}
n = db.parse(inputSource);
} else {
throw new RuntimeException("Unsupported source: " + source);
}
NodeList children = n.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeName().equals("dollars")) {
amount = child.getAttributes().getNamedItem("amount")
.getNodeValue();
break;
}
}
}
BigDecimal dollars = new BigDecimal(amount);
BigDecimal rupees = dollarToRupees(dollars);
BigDecimal euros = rupeesToEuro(rupees);
return createResultSource(rupees, euros);
} catch (Exception e) {
e.printStackTrace();
throw new HTTPException(500);
}
}
public BigDecimal dollarToRupees(BigDecimal dollars) {
BigDecimal result = dollars.multiply(rupeeRate);
return result.setScale(2, BigDecimal.ROUND_UP);
}
public BigDecimal rupeesToEuro(BigDecimal rupees) {
BigDecimal result = rupees.multiply(euroRate);
return result.setScale(2, BigDecimal.ROUND_UP);
}
private Source createResultSource(BigDecimal rupees, BigDecimal euros) {
String body = "<ns:return xmlns:ns=\"http://rest.jaxws.samples.geronimo.apache.org\">"
+ "<ns:dollarToRupeesResponse>"
+ rupees
+ "</ns:dollarToRupeesResponse><ns:rupeesToEurosResponse>"
+ euros + "</ns:rupeesToEurosResponse></ns:return>";
Source source = new StreamSource(new ByteArrayInputStream(
body.getBytes()));
return source;
}
}
和web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>jaxws-rest-converter</display-name>
<servlet>
<servlet-name>ConverterService</servlet-name>
<servlet-class> com.siemens.rest.ConverterService </servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ConverterService</servlet-name>
<url-pattern>/converter</url-pattern>
</servlet-mapping>
</web-app>
在 tomcat 6.0 中部署时,出现以下异常:
严重:Servlet /jaxws-rest-converter 抛出 load() 异常 java.lang.ClassCastException:com.siemens.rest.ConverterService 不能 被强制转换为 javax.servlet.Servlet 在 org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1116) 在 org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993) 在 org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4420) 在 org.apache.catalina.core.StandardContext.start(StandardContext.java:4733) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) 在 org.apache.catalina.core.StandardHost.start(StandardHost.java:840) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) 在 org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) 在 org.apache.catalina.core.StandardService.start(StandardService.java:525) 在 org.apache.catalina.core.StandardServer.start(StandardServer.java:754) 在 org.apache.catalina.startup.Catalina.start(Catalina.java:595) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在 java.lang.reflect.Method.invoke(未知来源)在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
我认为web.xml 是错误的,任何人都可以帮助我。我正在尝试在CXF 中实现宁静的网络服务。
【问题讨论】:
-
你用maven吗?你如何引入依赖关系?
标签: java web-services rest cxf