1 Reply Latest reply on Dec 17, 2012 2:16 AM by nickarls

    JBoss EJB SOAP WS: Annotation WebParam

    nerdine

      Hallo zusammen,

       

      ich versuche derzeit in einem SOAP Webservice eine Methode checkLogin(String login) mit dem benamten Webparameter "loginname" aufzurufen.

       

       

      Client (Interface):

      @WebService

      public interface IKundenmgmt {

          

          boolean checkLogin(@WebParam(name = "loginname")String login);

       

      }

       

      Client (Proxy Stub):

      public class SoapProxies {

       

         

          public static IKundenmgmt getIKundenmgmt() throws Exception {

              Service service_kundmgmt = Service.create(

                      new URL(Resources.getBackend_schemeAuthority()+Resources.getKundenmgmt_wsdl()),

                      new QName(Resources.getKundenmgmt_namespace(),Resources.getKundenmgmt_localpart()) );

              Iterator<QName> it = service_kundmgmt.getPorts();

              QName aux = null;

              while(it.hasNext()){

                  aux = it.next();

                  if(aux != null) break;

              }           

              BindingProvider bp = (BindingProvider)service_kundmgmt.getPort(aux, IKundenmgmt.class );

              bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, Resources.getBackend_user());

              bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, Resources.getBackend_passwd());

              return (IKundenmgmt)bp;

          }

      }

       

       

      Client (Aufruf in einer Managed Bean eines dyn. Webprojekts):

      @ManagedBean

      @SessionScoped

      public class Login_MBean {

       

      FacesContext fc = FacesContext.getCurrentInstance();

         

       

          public Login_MBean() {

              try {

                  k = SoapProxies.getIKundenmgmt();

                 

              } catch (Exception e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

              }

          }

       

      public String login() {

              HttpServletRequest request = (HttpServletRequest) fc

                      .getExternalContext().getRequest();

       

              if (k.checkLogin(loginname) == false) {

                  fc.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,

                          "Die eingegebene Userkennung existiert nicht.", null));

                  return "login";

              }

       

      }

       

       

      Server (WS Interface):

      @Remote

      public interface IKundenmgmt {

          

          boolean checkLogin(String login);

       

      }[/JAVA]

       

      Server (WS Implementierung):

      [JAVA]

      @Stateless

      @WebService

      @SOAPBinding(style = SOAPBinding.Style.RPC)

      public class Kundenmgmt implements IKundenmgmt {

       

      @Override

          @WebMethod

          public boolean checkLogin(@WebParam(name="loginname") String login) {

      ...

      }

       

      }

       

      Leider wirft es mir clientseitig folgende Fehlermeldung:

      exception

       

      javax.servlet.ServletException: javax.xml.ws.soap.SOAPFaultException: Found element arg0 but could not find matching RPC/Literal part

          javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

          filter.Startseitenfilter.doFilter(Startseitenfilter.java:77)

       

      root cause

       

      javax.faces.el.EvaluationException: javax.xml.ws.soap.SOAPFaultException: Found element arg0 but could not find matching RPC/Literal part

          javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)

          com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)

          javax.faces.component.UICommand.broadcast(UICommand.java:315)

          javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)

          javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)

          com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)

          com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

          com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)

          javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)

          filter.Startseitenfilter.doFilter(Startseitenfilter.java:77)

       

      Es scheint so, dass der Fehler im Client zu suchen ist, da im WSDL File der Parameter richtig benannt wurde (also mit Webparam):

      <wsdl:message name="checkLogin">

      <wsdl:part name="loginname" type="xsd:string"></wsdl:part>

      </wsdl:message>

       

      Der Client will davon aber wohl nichts wissen, denn er sucht weiterhin nach "arg0". Ich habe bereits mit der Webparam Annotation an verschiedenen Stellen (u.a. WS Server Interface) rumgespielt -> alles ohne Erfolg. Auch mit dem Zusatz "partName" der Webparam Annotation habe ich es bereits versucht.

       

      Kann bitte irgendjemand weiterhelfen?

       

      Danke!

       

      Gruß Nerdine