2012-04-05 13 views
1

Ich habe eine Beispielanwendung von Rechner für die Summe von zwei Zahlen mithilfe von Webservices in Java mithilfe von Jersey-Dienst erstellt.WebServices Calculator Beispiel mit Java

Mein Code ist: 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; 
    } 

} 

Und meine web.xml-Datei ist:

<?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> 

ich meine Bewerbung bin Ausführung mit: http://localhost:8080/CalculatorEx/rest/CalculatorService

i den Fehler wie folgt bin immer:

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

* hust * Google? – davidfrancis

+0

ist es, weil Ihre web.xml bezieht sich auf "com.restful.demo.resources" aber Ihr Code ist in dem Paket "mypack"? –

+0

Ich bekomme den gleichen Fehler nach dem Hinzufügen des Pakets "Mypack" in web.xml – spt

Antwort

0

Es ist, weil:

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

Ändern Sie es an:

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

Ich erhalte einen Fehler nach dem Hinzufügen des Pakets in web.xml: Die angegebene HTTP-Methode ist für die angeforderte Ressource nicht zulässig (Method Not Allowed). – spt

+0

@Praveensai Wie rufen Sie den Web-Service an? Wie übergeben Sie Parameter für die Summe? – jaxb

+0

dass wir für xml und unter Verwendung der Annotationen verwenden: @XmlAccessorType (XmlAccessType.FIELD) Zur Weiterleitung Parameter für Summe: @XmlType (name = "sum", propOrder = { "arg0", "arg1" }) in der Summenklasse @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "sumResponse", propOrder = { "_return" in SumResponse-Klasse – spt

0

Was ich sehe, ist ein Code mit einem JAX-WS-Web-Service und einer web.xm Ich registriere Jersey Servlet. In Ihrem Code befindet sich keine einzige JAX-RS-Ressource. Deshalb erhalten Sie den Fehler. Sehen Sie sich die JAX-RS-Spezifikation an und sehen Sie, wie Sie JAX-RS-Ressourcen schreiben.

+0

Ich bin neu bei webservice.please help me – spt

+0

Ich arbeite von diesem Beispiel: http://www.jgeppert.com/2009/03/restful-web-services-jax-rs-mit-jersey/ Bitte geben Sie Vorschläge wie es geht. – spt

+1

Dieses Beispiel sieht gut aus, aber Ihr Code ist sehr unterschiedlich. Scheint so, als hättest du alle jax-rs Annotationen durch jax-ws ersetzt. Also kein Wunder, dass es nicht funktioniert. Lies einfach einen einführenden Artikel über jax-rs. Z.B. http://jersey.java.net/nonav/documentation/latest/jax-rs.html –