I have created an sample application of calculator for sum of two numbers using webservices in Java by using Jersey service.
My code is : 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. * */@XmlRegistrypublic 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> * <complexType name="sum"> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element name="arg0" type="{http://www.w3.org/2001/XMLSchema}int"/> * <element name="arg1" type="{http://www.w3.org/2001/XMLSchema}int"/> * </sequence> * </restriction> * </complexContent> * </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> * <complexType name="sumResponse"> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * </sequence> * </restriction> * </complexContent> * </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; }}
And my web.xml file is:
<?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>
I am executing my application using:http://localhost:8080/CalculatorEx/rest/CalculatorService
i am getting the error like this:
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)