2011-11-29 96 views
0

我的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服務。

+0

你使用maven嗎?你如何引入依賴關係? – AHungerArtist

+0

我使用eclipse而不是maven –

回答

0

我認爲你的實現有幾個錯誤。

首先你的web.xml確實是錯的。這個文件是爲了聲明servlet,過濾器等,但從來沒有web服務提供商。您正在獲取ClassCastException,因爲您告訴您的ConverterService是一個servlet。

所以,你需要做的是在你的web.xml中聲明Apache CXF servlet讓他提出一些請求。檢查此示例:

<!-- 
     Web service Front Controller. It will receive all the web service request and then it 
     delegates the request to the web services configured in the CXF config file 
    --> 
    <servlet> 
     <servlet-name>CXFServlet</servlet-name> 
     <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- 
     Every request that start with this will be handled by the CXF servlet 
    --> 
    <servlet-mapping> 
     <servlet-name>CXFServlet</servlet-name> 
     <url-pattern>/ctx/authbasic/ws/*</url-pattern> 
    </servlet-mapping> 

之後,您需要正確聲明每個Web服務。我使用Spring來配置我的Apache CXF服務,所以在這裏你可以檢查一個例子。

<jaxws:endpoint id="dataService" 
     implementor="some.package.DataSIB" 
     address="/DataService" wsdlLocation="classpath:wsdls/DataService.wsdl"> 
     <jaxws:properties> 
      <!-- jaxws properties binding config --> 
     </jaxws:properties> 
     <jaxws:dataBinding> 
      <!-- data binding config --> 
     </jaxws:dataBinding> 
    </jaxws:endpoint> 

有了這個配置,你/ctx/authbasic/ws/DataService任何請求都將被由Web服務實現處理。這裏Web服務聲明的例子(SEI)及其履行情況(SIB):

@WebService(name = "dataService", targetNamespace = "http://some-domain/dataservice/definition") 
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED) 
public interface DataSEI { 
    // You methods here 
} 

@WebService(endpointInterface = "some.package.DataSEI", 
serviceName = "dataServiceService", 
portName = "dataServicePort", 
targetNamespace = "http://some-domain/dataservice/definition") 
public class DataSIB implements DataSEI { 
    // Your methods here 
} 

注:這是一個SOAP Web服務的例子,但是這可能會幫助你理解框架