se8 overview jdk javase docs java wsdl weblogic jax-ws webservice-client

overview - jbutton java 8



javax.xml.ws.WebServiceException: no se pudo acceder al WSDL. Respuesta: ''401: no autorizado'' (4)

Estoy intentando acceder a un servicio web para un proyecto en el que estoy trabajando. Estoy usando JAX-WS y la aplicación se implementa en weblogic. Cuando intento acceder al WS, obtengo la siguiente excepción:

javax.portlet.PortletException: javax.xml.ws.WebServiceException: Failed to access the WSDL at: http://xxx.xxxx.ro:40000/idm/ws/cup?wsdl. It failed with: Response: ''401: Unauthorized'' for url: ''http://xxx.xxxx.ro:40000/idm/ws/cup?wsdl''. at com.bea.portlet.container.PortletStub.processAction(PortletStub.java:346) at com.bea.portlet.container.AppContainer.invokeProcessAction(AppContainer.java:678) ........

Leí un montón de publicaciones sobre problemas y probé diferentes tipos de autenticación. Traté de usar BindingProvider, basicHTTPAuth en diferentes usos, deshabilitar HostnameVerifier, etc., pero aún sin resultado.

Debajo hay un fragmento de mi código, como la última versión probada:

Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( username, password.toCharArray()); } }); ComputeUserProfileImplService computeUserProfileImplService = new ComputeUserProfileImplService( new URL(null, endpointURL, new sun.net.www.protocol.http.Handler()), new QName("http://xxx.xx.xxxxx.xxxxx.com/", "ComputeUserProfileImplService")); ComputeUserProfileImpl computeUserProfile = computeUserProfileImplService .getComputeUserProfileImplPort();

El código ComputeUserProfileImplService se ve así:

private final static URL COMPUTEUSERPROFILEIMPLSERVICE_WSDL_LOCATION; private final static Logger logger = Logger.getLogger(com.xxxxx.xxxxx.xx.xxxxx.cup.ComputeUserProfileImplService.class.getName()); static { URL url = null; try { URL baseUrl; baseUrl = com.xxxxx.xxxxx.xx.xxxxx.xxx.ComputeUserProfileImplService.class.getResource(""); url = new URL(baseUrl, "http://xxxx.xxxxx.ro:40000/idm/ws/cup?wsdl"); } catch (MalformedURLException e) { logger.warning("Failed to create URL for the wsdl Location: ''xxxxxxxxxxxxxxxx'', retrying as a local file"); logger.warning(e.getMessage()); } COMPUTEUSERPROFILEIMPLSERVICE_WSDL_LOCATION = url; }

Perdón por reemplazar los enlaces, pero no estoy autorizado a publicarlos ya que es una organización bastante conocida. Si me pueden ayudar con algunas sugerencias, les estaré agradecido. Sigo buscando soluciones, pero estoy atascado ... no puedo entenderlo. Debería ser una solución para este problema weblogic que se aplica a mí ... pero simplemente no puedo encontrarlo. Si lo necesita, publicaré algunos otros fragmentos. Espero haber sido bastante claro con esto.

Gracias por adelantado !!


No intenté esto en WebLogic, pero en Tomcat, Glassfish, Apache Karaf, la cliet call al servicio web que necesita la autenticación básica, esto funciona muy bien:

/** * Proxy. */ private OperationsService proxy; /** * Operations wrapper constructor. * * @throws SystemException if error occurs */ public OperationsWrapper() throws SystemException { try { final String username = getBundle().getString("wswrappers.operations.username"); final String password = getBundle().getString("wswrappers.operations.password"); Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( username, password.toCharArray()); } }); URL url = new URL(getBundle().getString("wswrappers.operations.url")); QName qname = new QName("http://hltech.lt/ws/operations", "Operations"); Service service = Service.create(url, qname); proxy = service.getPort(OperationsService.class); Map<String, Object> requestContext = ((BindingProvider) proxy).getRequestContext(); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url.toString()); requestContext.put(BindingProvider.USERNAME_PROPERTY, username); requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); Map<String, List<String>> headers = new HashMap<String, List<String>>(); headers.put("Timeout", Collections.singletonList(getBundle().getString("wswrappers.operations.timeout"))); requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, headers); } catch (Exception e) { LOGGER.error("Error occurred in operations web service client initialization", e); throw new SystemException("Error occurred in operations web service client initialization", e); } }

No creo que WebLogic tenga algo diferente. Esto debería funcionar.


Desafortunadamente Weblogic tiene un enfoque diferente, utiliza su propio URLStreamHandler que por alguna razón ignora la autenticación.

Intenta usar la implementación de Sun:

en lugar de

url = new URL(address); // use WebLogic handler

utilizar

url = new URL(null, address, new sun.net.www.protocol.http.Handler()); // use Sun''s handler


Tuve el mismo problema en Weblogic. Puedo confirmarle que la solución sugerida por Paulius Matulionis funcionó para mí en Weblogic 11:

import my.MyPortType; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.Service; import javax.xml.ws.handler.MessageContext; import java.net.Authenticator; import java.net.MalformedURLException; import java.net.PasswordAuthentication; import java.net.URL; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class MyWebServiceClient { public static void main(String[] args) { URL url = null; try { url = new URL("http://host:10001/mycontext/ws?WSDL"); } catch (MalformedURLException e) { e.printStackTrace(); } try { final String username = "some"; final String password = "other"; Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( username, password.toCharArray()); } }); QName qname = new QName("http://whatevertheqname/", "whatevertheservicename"); Service service = Service.create(url, qname); MyPortType proxy = service.getPort(MyPortType.class); Map<String, Object> requestContext = ((BindingProvider) proxy).getRequestContext(); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url.toString()); requestContext.put(BindingProvider.USERNAME_PROPERTY, username); requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); Map<String, List<String>> headers = new HashMap<String, List<String>>(); headers.put("Timeout", Collections.singletonList("10000")); requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, headers); String result = proxy.myMethod23"); System.out.println("Result is: " + result); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Error occurred in operations web service client initialization", e); } } }


Las siguientes son sugerencias que podrían resolver su problema:

1) Cambio en el script de WEBLOGIC setDomainEnv.sh para obligar a WEBLOGIC a usar SunHttpHandler .

o

2) Llame al servicio web desde el símbolo del sistema utilizando un script de shell / archivo por lotes.

o

3) Pruebe este objeto url en su new URL(null, "http://...", new sun.net.www.protocol.http.Handler()); web new URL(null, "http://...", new sun.net.www.protocol.http.Handler());

o

4) Escribe tu propio manejador de http solar.

o

5) Intente actualizar su weblogic-webservice.xml agregando el servicio web recién creado en él.

o

6) Intente usar jax-rpc en lugar de jax-ws.

Con suerte, cualquiera de los dos primeros resolverá su problema, sin embargo, las otras opciones también son útiles.