2012-08-09 287 views
1

我正在嘗試訪問我正在處理的項目的Web服務。我正在使用JAX-WS,並且該應用程序部署在weblogic上。當我嘗試訪問WS,我得到下面的異常:javax.xml.ws.WebServiceException:無法訪問WSDL。迴應:'401:未經授權'

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) 
........ 

我通過有關問題很多帖子的閱讀,我嘗試了不同類型的權威性的。我試圖在不同的用例中使用BindingProvider,basicHTTPAuth,禁用HostnameVerifier等,但仍然沒有結果。

下面是我的代碼片段,作爲最後的嘗試版本:

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(); 

的ComputeUserProfileImplService代碼如下所示:

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; 
} 

對不起更換的聯繫,但我不認可張貼他們,因爲它是一個非常知名的組織。如果你能幫助我一些建議,我將不勝感激。我一直在尋找解決方案,但我卡住了..我無法弄清楚。它應該是適用於我的這個weblogic問題的解決方法......但我無法找到它。如果你需要它,我會發布一些其他片段。希望我對此很清楚。

在此先感謝!

回答

4

不幸的是,Weblogic有一個不同的方法,它使用自己的URLStreamHandler,由於某種原因忽略認證。

嘗試使用Sun的實現:中

代替

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

使用

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

我並沒有嘗試這種在WebLogic中,但在Tomcat,Glassfish的,阿帕奇Karaf的cliet調用的Web服務,這需要基本身份驗證這工作好了:

/** 
* 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); 
    } 
} 

我不認爲在WebLogic有不同的東西。這應該工作。

4

我有同樣的問題在Weblogic的。 我可以確認你通過Paulius Matulionis提出的解決方案中的Weblogic 11爲我工作:

1)在WebLogic腳本的setDomainEnv變化:

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); 
     } 


    } 
} 
0

,可以解決你的問題,以下是建議。 sh強制WEBLOGIC使用SunHttpHandler

2)呼叫從使用shell腳本/批處理文件中的命令提示的web服務。

3)試試這個URL對象在你的web服務new URL(null, "http://...", new sun.net.www.protocol.http.Handler());

4)寫你自己的太陽HTTP處理程序。

5)嘗試在它加入新創建的Web服務更新您的weblogic-webservice.xml。

6)嘗試使用JAX-RPC而不是JAX-WS。

希望前兩個中的任何一個都能解決您的問題,但其他選項也很有幫助。