[jboss-user] [JBossWS] - Re: Web Service Client

bsisson do-not-reply at jboss.com
Fri May 9 15:41:24 EDT 2008


In my Eclipse client I generated the web service stubs and proxy by creating a new project, then right clicking on the project selecting new->other->web service->web service client. When setting up the client I pointed it to my web service WSDL file ex:(http://localhost:8280/PSDynamicWebProject/TestWs?wsdl).  I then just setup a simple test class to call the web service (code below):

package service.client;

import java.rmi.RemoteException;

import org.domain.PSDynamicWebProject.pojo.TestWs;
import org.domain.PSDynamicWebProject.pojo.TestWsProxy;

public class RunnerOld
{
    public static void main(String[] args)
    {
        TestWs tw = new TestWsProxy();
        try
        {
            System.out.println(tw.greet("1"));
        }
        catch (RemoteException e)
        {
            System.out.println(e.getMessage());
        }
    }
}

This code worked fine (called the web service and received the correct response back).  

Now I wanted to create the web service client using the annotations from JSR-181.  I looked a several different examples and the best that I can conclude is that I still need to generate the stubs and proxy files so I set them up in my project in the same way as I did above.  I then create a simple class to call my web service (code below):

package service.client;

import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import javax.xml.ws.WebServiceRef;
import org.domain.PSDynamicWebProject.pojo.TestWs;
import org.domain.PSDynamicWebProject.pojo.TestWsService;

public class Runner
{
@WebServiceRef(wsdlLocation="http://127.0.0.1:8280/PSDynamicWebProject/TestWs?wsdl")
private static TestWsService service;

   public static void main(String[] args)
    {
        try
        {
            TestWs tw = service.getTestWsPort();
            System.out.println(tw.greet("1"));
        }
        catch (RemoteException e)
        {
            System.out.println(e.getMessage());
        }
        catch (ServiceException e)
        {
            System.out.println(e.getMessage());
        }
    }
}

This client however failed.  It got a java null pointer exception on this statement:  TestWs tw = service.getTestWsPort();  I debugged it and found tha the service object was null.

I have several questions regarding this approach:

1) I am curious why the service object was null and I got a null pointer exception?

2) Is this the correct way to setup and use the JSR-181?  I find it interesting that if we still must generate the stubs and prox from the WSDL before we can use the annotations then what advantage is there to using the annotations?

Any clarity and help would be greatly appreciated.  I can see the benefit in using JSR-181 to setup the web services from previous web services that I setup and the advantage of the annotations.  However, I don't see any benefits in the annotations on the client if I'm doing this correctly (which I may not be).

Here is the simple code from my web serivce for review (this works):

package org.domain.PSDynamicWebClient.pojo;

import java.io.StringWriter;
import java.util.Date;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.transform.stream.StreamResult;

import org.domain.PSDynamicWebClient.entity.Employee;
import org.domain.PSDynamicWebClient.session.SelectEmployee;
import org.jboss.seam.Component;


/**
 * This is a webservice class exposing a method called greet which takes a
 * input parameter and greets the parameter with hello.
 *
 * @author dhanago
 */

/*
 * @WebService indicates that this is webservice interface and the name
 * indicates the webservice name.
 */
@WebService(name = "TestWs", serviceName = "TestWsService")
/*
 * @SOAPBinding indicates binding information of soap messages. Here we have
 * document-literal style of webservice and the parameter style is wrapped.
 */
@SOAPBinding
   (
         style = SOAPBinding.Style.DOCUMENT,
         use = SOAPBinding.Use.LITERAL,
         parameterStyle = SOAPBinding.ParameterStyle.WRAPPED
    )    
public class TestWs
{
   @WebMethod
   public String greet( @WebParam(name = "emplid")
   String emplid )
   {
       try
       {
           /**************************************************************************
            * The following example marshals an object class into an XML string which
            * is returned to the caller.  The object is an entity representing a 
            * row on the database.
            **************************************************************************/
           // Query the database for an employee's information
           SelectEmployee selectEmployee =  (SelectEmployee) Component.getInstance("selectEmployee");
           selectEmployee.setId(emplid);
           Employee e = selectEmployee.getInstance();
           
           // Marshal the employee information into an xml string and return it
           JAXBContext context = JAXBContext.newInstance(Employee.class);    
           Marshaller marshaller = context.createMarshaller();    
           StreamResult result = new StreamResult( new StringWriter());
           marshaller.marshal(e, result);
           return result.getWriter().toString();           
       }
       catch (Exception e)
       {
           return e.getMessage();
       }
   }
}   


View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4149858#4149858

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4149858



More information about the jboss-user mailing list