2012-04-05 44 views
1

我已經使用Jersey服務在Java中使用webservices創建了計算器的示例應用程序,用於計算兩個數字的總和。使用Java的WebServices計算器示例

我的代碼是: Calculator.java

package p1; 
import javax.jws.WebService; 
import javax.jws.WebMethod; 
import javax.ws.rs.Path; 

@WebService 
@Path("/CalculatorService") 
public class Calculator 
{ 
    @WebMethod 
    public String sum(int x,int y) 
    { 
     return ""+(x+y); 
    } 
} 

Calculator.java:

package mypack; 

import javax.jws.WebMethod; 
import javax.jws.WebParam; 
import javax.jws.WebResult; 
import javax.jws.WebService; 
import javax.xml.ws.RequestWrapper; 
import javax.xml.ws.ResponseWrapper; 


/** 
* This class was generated by the JAXWS SI. 
* JAX-WS RI 2.0_02-b08-fcs 
* Generated source version: 2.0 
* 
*/ 
@WebService(name = "Calculator", targetNamespace = "http://p1/") 
public interface Calculator { 


    /** 
    * 
    * @param arg1 
    * @param arg0 
    * @return 
    *  returns java.lang.String 
    */ 
    @WebMethod 
    @WebResult(targetNamespace = "") 
    @RequestWrapper(localName = "sum", targetNamespace = "http://p1/", className = "mypack.Sum") 
    @ResponseWrapper(localName = "sumResponse", targetNamespace = "http://p1/", className = "mypack.SumResponse") 
    public String sum(
     @WebParam(name = "arg0", targetNamespace = "") 
     int arg0, 
     @WebParam(name = "arg1", targetNamespace = "") 
     int arg1); 

} 

CalculatorService.java:

package mypack; 

import java.net.MalformedURLException; 
import java.net.URL; 
import javax.xml.namespace.QName; 
import javax.xml.ws.Service; 
import javax.xml.ws.WebEndpoint; 
import javax.xml.ws.WebServiceClient; 


/** 
* This class was generated by the JAXWS SI. 
* JAX-WS RI 2.0_02-b08-fcs 
* Generated source version: 2.0 
* 
*/ 
@WebServiceClient(name = "CalculatorService", targetNamespace = "http://p1/", wsdlLocation = "http://localhost:8081/MyCalculatorWs/CalculatorService?WSDL") 
public class CalculatorService 
    extends Service 
{ 

    private final static URL CALCULATORSERVICE_WSDL_LOCATION; 

    static { 
     URL url = null; 
     try { 
      url = new URL("http://localhost:8081/MyCalculatorWs/CalculatorService?WSDL"); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
     CALCULATORSERVICE_WSDL_LOCATION = url; 
    } 

    public CalculatorService(URL wsdlLocation, QName serviceName) { 
     super(wsdlLocation, serviceName); 
    } 

    public CalculatorService() { 
     super(CALCULATORSERVICE_WSDL_LOCATION, new QName("http://p1/", "CalculatorService")); 
    } 

    /** 
    * 
    * @return 
    *  returns Calculator 
    */ 
    @WebEndpoint(name = "CalculatorPort") 
    public Calculator getCalculatorPort() { 
     return (Calculator)super.getPort(new QName("http://p1/", "CalculatorPort"), Calculator.class); 
    } 

} 

ObjectFactory.java:

package mypack; 

import javax.xml.bind.JAXBElement; 
import javax.xml.bind.annotation.XmlElementDecl; 
import javax.xml.bind.annotation.XmlRegistry; 
import javax.xml.namespace.QName; 


/** 
* This object contains factory methods for each 
* Java content interface and Java element interface 
* generated in the mypack package. 
* <p>An ObjectFactory allows you to programatically 
* construct new instances of the Java representation 
* for XML content. The Java representation of XML 
* content can consist of schema derived interfaces 
* and classes representing the binding of schema 
* type definitions, element declarations and model 
* groups. Factory methods for each of these are 
* provided in this class. 
* 
*/ 
@XmlRegistry 
public class ObjectFactory { 

    private final static QName _Sum_QNAME = new QName("http://p1/", "sum"); 
    private final static QName _SumResponse_QNAME = new QName("http://p1/", "sumResponse"); 

    /** 
    * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: mypack 
    * 
    */ 
    public ObjectFactory() { 
    } 

    /** 
    * Create an instance of {@link Sum } 
    * 
    */ 
    public Sum createSum() { 
     return new Sum(); 
    } 

    /** 
    * Create an instance of {@link SumResponse } 
    * 
    */ 
    public SumResponse createSumResponse() { 
     return new SumResponse(); 
    } 

    /** 
    * Create an instance of {@link JAXBElement }{@code <}{@link Sum }{@code >}} 
    * 
    */ 
    @XmlElementDecl(namespace = "http://p1/", name = "sum") 
    public JAXBElement<Sum> createSum(Sum value) { 
     return new JAXBElement<Sum>(_Sum_QNAME, Sum.class, null, value); 
    } 

    /** 
    * Create an instance of {@link JAXBElement }{@code <}{@link SumResponse }{@code >}} 
    * 
    */ 
    @XmlElementDecl(namespace = "http://p1/", name = "sumResponse") 
    public JAXBElement<SumResponse> createSumResponse(SumResponse value) { 
     return new JAXBElement<SumResponse>(_SumResponse_QNAME, SumResponse.class, null, value); 
    } 

} 

package-info.java:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://p1/") 
package mypack; 

Sum.java:

package mypack; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlType; 


/** 
* <p>Java class for sum complex type. 
* 
* <p>The following schema fragment specifies the expected content contained within this class. 
* 
* <pre> 
* &lt;complexType name="sum"> 
* &lt;complexContent> 
*  &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
*  &lt;sequence> 
*   &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}int"/> 
*   &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}int"/> 
*  &lt;/sequence> 
*  &lt;/restriction> 
* &lt;/complexContent> 
* &lt;/complexType> 
* </pre> 
* 
* 
*/ 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "sum", propOrder = { 
    "arg0", 
    "arg1" 
}) 
public class Sum { 

    protected int arg0; 
    protected int arg1; 

    /** 
    * Gets the value of the arg0 property. 
    * 
    */ 
    public int getArg0() { 
     return arg0; 
    } 

    /** 
    * Sets the value of the arg0 property. 
    * 
    */ 
    public void setArg0(int value) { 
     this.arg0 = value; 
    } 

    /** 
    * Gets the value of the arg1 property. 
    * 
    */ 
    public int getArg1() { 
     return arg1; 
    } 

    /** 
    * Sets the value of the arg1 property. 
    * 
    */ 
    public void setArg1(int value) { 
     this.arg1 = value; 
    } 

} 

SumResponse.java:

package mypack; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 


/** 
* <p>Java class for sumResponse complex type. 
* 
* <p>The following schema fragment specifies the expected content contained within this class. 
* 
* <pre> 
* &lt;complexType name="sumResponse"> 
* &lt;complexContent> 
*  &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
*  &lt;sequence> 
*   &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> 
*  &lt;/sequence> 
*  &lt;/restriction> 
* &lt;/complexContent> 
* &lt;/complexType> 
* </pre> 
* 
* 
*/ 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "sumResponse", propOrder = { 
    "_return" 
}) 
public class SumResponse { 

    @XmlElement(name = "return") 
    protected String _return; 

    /** 
    * Gets the value of the return property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getReturn() { 
     return _return; 
    } 

    /** 
    * Sets the value of the return property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setReturn(String value) { 
     this._return = value; 
    } 

} 

我的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_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>CalculatorEx</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.restful.demo.resources</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

我執行使用我的應用程序: http://localhost:8080/CalculatorEx/rest/CalculatorService

我得到這樣的錯誤:

exception: 
javax.servlet.ServletException: Servlet.init() for servlet Jersey REST Service threw exception 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    java.lang.Thread.run(Thread.java:679) 

root cause: 
com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes. 
    com.sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.java:99) 
    com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1298) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:169) 
    com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:775) 
    com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:771) 
    com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:771) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:766) 
    com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:488) 
    com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:318) 
    com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:609) 
    com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210) 
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:373) 
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:556) 
    javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    java.lang.Thread.run(Thread.java:679) 
+0

*咳嗽*谷歌? – davidfrancis 2012-04-05 09:34:51

+0

是否因爲你的web.xml引用了「com.restful.demo.resources」,但你的代碼位於「mypack」包中? – 2012-04-05 09:54:23

+0

在web.xml中添加軟件包「mypack」後出現同樣的錯誤 – spt 2012-04-05 10:18:16

回答

0

這是因爲:

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>com.restful.demo.resources</param-value> 
</init-param> 

將其更改爲:

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>p1</param-value> 
</init-param> 
+0

在web.xml中添加軟件包後出現錯誤: 指定的HTTP方法不允許用於所請求的資源(方法不允許)。 – spt 2012-04-05 10:15:14

+0

@Praveensai如何打電話給網絡服務?你如何傳遞參數總和? – jaxb 2012-04-05 10:39:45

+0

對於我們正在使用XML,並通過使用註釋: @XmlAccessorType(XmlAccessType.FIELD) 對於傳遞參數總和: @XmlType(名稱= 「總和」,propOrder = { 「爲arg0」, 「ARG1」 })總和類 @XmlAccessorType(XmlAccessType。在SUMResponse類 – spt 2012-04-05 10:45:12

0

我看到的是使用JAX-WS Web服務和web.xm的代碼l註冊Jersey servlet。代碼中沒有單個JAX-RS資源。所以這就是你得到錯誤的原因。查看JAX-RS規範並瞭解如何編寫JAX-RS資源。

+0

我是新來的webservice.please幫我 – spt 2012-04-06 07:38:59

+0

我正在從這個例子工作: http://www.jgeppert.com/2009/03/restful-web-services-jax-rs-mit-jersey/ 請給建議是如何做到的。 – spt 2012-04-06 07:46:28

+1

該示例看起來不錯,但你的代碼是非常不同的。好像你用jax-ws替換了所有的jax-rs註釋。所以難怪它不起作用。請閱讀關於jax-rs的任何介紹性文章。例如。 http://jersey.java.net/nonav/documentation/latest/jax-rs.html – 2012-04-06 08:40:00