我的web服务类如下:的Java CXF宁静的WebServices
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,IAM收到以下异常进行部署:
SEVERE:Servlet/jaxws-rest-converter抛出load()异常 java.lang.ClassCastException:com.siemens.rest.Co nverterService不能 被强制转换为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) at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) at org.apache.catalina.core.ContainerBase.start( ContainerBas e.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) at org.apache.catalina.startup.Catalina.start(Catalina.java:595)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native法)维持在在 java.lang.reflect.Method.invoke(来源不明) sun.reflect.DelegatingMethodAccessorImpl.invoke(来源不明) sun.reflect.NativeMethodAccessorImpl.invoke(来源不明)在 org.apache.catalina .startup.Bootstrap.start(Bootstrap.java:289)在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
我觉得web.xml
是错误的,任何人都可以请帮我在这。 Iam试图在CXF
中实施宁静的web服务。
你使用maven吗?你如何引入依赖关系? – AHungerArtist
我使用eclipse而不是maven –