JBoss EJB SOAP WS: Annotation WebParam
nerdine Dec 14, 2012 9:12 AMHallo 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