org.jboss.resteasy.le spi.UnhandledException: javax. xml. ws. soap. SOAPFaultException: ARERR [149] Un nom d'utilisateur doit être fourni dans l'enregistrement de contrôle
Salut à tous j'ai besoin d'une aide.
J'écris le wrapper en haut du wsdl.
Ma demande SOAPUI est :-
Je dois envoyer ma demande comme ceci
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:UET_CMContacts_WS">
<soapenv:Header>
<urn:AuthenticationInfo>
<urn:userName>test</urn:userName>
<urn:password>test</urn:password>
</urn:AuthenticationInfo>
</soapenv:Header>
<soapenv:Body>
<urn:opGetContacts>
<urn:Qualification>LoginName="TEST"</urn:Qualification>
<urn:startRecord>0</urn:startRecord>
<urn:maxLimit>20</urn:maxLimit>
</urn:opGetContacts>
</soapenv:Body>
</soapenv:Envelope>
Voici mon code Java
UETCMContactsWSService service1 = new UETCMContactsWSService();
service1.setHandlerResolver(new SOAPHandlerResolver());
ContactDetailsPortType port1 = service1.getContactDetailsSoap();
AuthenticationInfo authInfo = new AuthenticationInfo();
authInfo.setUserName(uetRequestParameters.getUserName());
authInfo.setPassword(uetRequestParameters.getPassword());
Map<String, Object> requestContext = ((BindingProvider)port1).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, uetRequestParameters.getUserName());
requestContext.put(BindingProvider.PASSWORD_PROPERTY, uetRequestParameters.getPassword());
requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, requestContext);
InputMapping1 inputMap = new InputMapping1();
inputMap.setQualification(uetRequestParameters.getQualification());
inputMap.setStartRecord(uetRequestParameters.getStartRecord());
inputMap.setMaxLimit(uetRequestParameters.getMaxLimit());
List<GetListValues> getListValue= port1.opGetContacts(
inputMap.getQualification(),
inputMap.getStartRecord(),
inputMap.getMaxLimit());
En utilisant ce code quand je regarde ma réponse dans SOAPHandler
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
<soap:Body>
<opGetContacts xmlns="urn:UET_CMContacts_WS">
<Qualification>VKUMARRA</Qualification>
<startRecord>0</startRecord>
<maxLimit>20</maxLimit>
</opGetContacts>
</soap:Body>
</soap:Envelope>
Et aussi je reçois l'exception: -
12:50:15,924 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/UETProfile].[Resteasy]] (http-localhost/127.0.0.1:8080-1) JBWEB000236: Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.UnhandledException: javax.xml.ws.soap.SOAPFaultException: ARERR [149] A user name must be supplied in the control record
at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:365) [resteasy-jaxrs-2.3.7.Final-redhat-2.jar:2.3.7.Final-redhat-2]
[jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_65]
Caused by: javax.xml.ws.soap.SOAPFaultException: ARERR [149] A user name must be supplied in the control record
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:157)
at com.sun.proxy.$Proxy62.opGetContacts(Unknown Source)
at com.cox.etadirect.rs.route.GetUetProfileWS.startRoute(GetUetProfileWS.java:90) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_65]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_65]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_65]
Quelqu'un a une idée à ce sujet où je vais mal.
1 answers
Il y a certaines choses dans votre code qui, je pense, ne correspondent pas à votre demande. Par exemple, comme vous l'avez dit, vous souhaitez ajouter le fragment xml suivant dans votre soap:Header
<soap:Header>
<urn:AuthenticationInfo>
<urn:userName>test</urn:userName>
<urn:password>test</urn:password>
</urn:AuthenticationInfo>
</soap:Header>
Comme je le vois dans votre code, vous créez cette structure:
AuthenticationInfo authInfo = new AuthenticationInfo();
authInfo.setUserName(uetRequestParameters.getUserName());
authInfo.setPassword(uetRequestParameters.getPassword());
Cependant, dans votre code, vous le définissez mais ne l'affectez pas dans la requête soap:Header
.
Vous essayez également d'ajouter et http heades
pour {[6] } ce qui, je pense, n'est pas nécessaire pour votre WS (au moins, vous ne le dites pas dans votre question):
Map<String, Object> requestContext = ((BindingProvider)port1).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, uetRequestParameters.getUserName());
requestContext.put(BindingProvider.PASSWORD_PROPERTY, uetRequestParameters.getPassword());
requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, requestContext);
Je pense que la solution est simplement mise authInfo
dans le soap:Header
comme le WS l'attend.
J'espère que cela aide,