0

ExchangeWebサービスを使用してExchangeサーバーにJAX-WSWebサービス呼び出しを行うJavaで記述されたWebアプリケーションがあります。

Java 1.6.0_34を使用してアプリケーションをコンパイルして実行すると、正常に動作します。

Java 1.7.0_07でコンパイルして実行すると、次のエラーが発生します。

com.sun.xml.ws.client.ClientTransportException: request requires HTTP authentication: Unauthorized
    at com.sun.xml.ws.transport.http.client.HttpClientTransport.checkResponseCode(HttpClientTransport.java:212)
    at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:149)
    at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:86)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436)
    at com.sun.xml.ws.client.Stub.process(Stub.java:248)
    at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:135)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:109)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:118)
    at $Proxy62.getUserAvailability(Unknown Source)
    ...

これは、1.6.0_34でコンパイルし、1.7.0_07で実行した場合にも発生します。

Java 6と7の間でJAX-WSへの変更を探しましたが、コンパイルエラーの可能性についてのメモしか見つかりませんでした。

明らかに認証コードが変更されていないので、次に何を見るべきかわかりませんが、なぜ失敗するのですか?

認証を設定する必要があると思う方法は次のとおりです。

/**
 *  Set up Authentication
 *
 */
protected void setupAuthenticator(){
    if(authenticator == null){
        authenticator = new Authenticator(){
            protected PasswordAuthentication getPasswordAuthentication(){
                String superusername = ExchangeServerPortFactory.this.adDomain
                                + "\\" 
                                + ExchangeServerPortFactory.this.username;
                String superPassword = ExchangeServerPortFactory.this.password;
                return new PasswordAuthentication(superusername
                                         ,superPassword.toCharArray());
            }
        };
        Authenticator.setDefault(authenticator);
    }
}

同様の問題が解決したフォーラムのどこかでメッセージを見つけたので、に変更"\\""\\\\"てみましたが、うまくいきませんでした。

4

2 に答える 2

0

さて、これは私がこれまでに得たものです、あなたは交換サービスを呼んでいます、しかしあなたは今基本認証方法を使用しています、あなたが必要とするのはNTML認証です、私はこれがj7ではなくj6で動作する理由がわかりません、しかし、クライアントがサービスのwsdlに基づいてリクエストを解析していると思います。これは、サービスが交換サービスであることを定義している可能性があり、j7にはNTML認証用の特定の認証機能がある可能性がありますが、これも非常に長いショットであり、多くの物。

( Marcel Levyへのすべてのクレジット)

まず、オーセンティケーターを作成します。

import java.net.Authenticator;
import java.net.PasswordAuthentication;

public class NtlmAuthenticator extends Authenticator {

  private final String username;
  private final char[] password;

  public NtlmAuthenticator(final String username, final String password) {
    super();
    this.username = new String(username);
    this.password = password.toCharArray(); 
  }

  @Override
  public PasswordAuthentication getPasswordAuthentication() {
    return (new PasswordAuthentication (username, password));
  }
}

アプリケーションで、オーセンティケーターをデフォルトとして設定します。

String username = "DOMAIN\\USERNAME";
String password = "PASSWORD"

NtlmAuthenticator authenticator = new NtlmAuthenticator(username, password);
Authenticator.setDefault(authenticator);

あなたはおそらくこれを試しました、もしそうなら、この答えを無視してください。

于 2012-12-10T15:20:47.447 に答える
0

1.7.0u10以降で動作するようです。

これは、そのリリースで修正されたバグ8003948が原因であると推測できます。

于 2013-07-24T14:35:23.140 に答える