SharePoint 2010 Web服务上的Java JBoss 401错误

SharePoint 2010 Web服务上的Java JBoss 401错误,java,web-services,jboss,sharepoint-2010,http-status-code-401,Java,Web Services,Jboss,Sharepoint 2010,Http Status Code 401,在EclipseIDE中测试时,我的代码成功运行 我正在使用生成的Copy.wsdl通过Web服务连接到MS SharePoint 2010 当我在JBoss服务器(运行Adobe LifeCycle)上部署代码时,我的代码收到一个401错误 错误: Caused by: org.jboss.ws.WSException: Invalid HTTP server response [401] - Unauthorized at org.jboss.ws.core.soap.SOAPMessage

在EclipseIDE中测试时,我的代码成功运行

我正在使用生成的Copy.wsdl通过Web服务连接到MS SharePoint 2010

当我在JBoss服务器(运行Adobe LifeCycle)上部署代码时,我的代码收到一个401错误

错误:

Caused by: org.jboss.ws.WSException: Invalid HTTP server response [401] - Unauthorized
at org.jboss.ws.core.soap.SOAPMessageUnMarshallerHTTP.read(SOAPMessageUnMarshallerHTTP.java:75)
at org.jboss.remoting.transport.http.HTTPClientInvoker.readResponse(HTTPClientInvoker.java:608)
at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:402)
at org.jboss.remoting.transport.http.HTTPClientInvoker.makeInvocation(HTTPClientInvoker.java:253)
... 156 more
现在,如果我故意通过IDE使用错误的登录,我会得到以下错误:

com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 401: Unauthorized
更新:

因此,经过更多的研究发现,J2EE支持,以及NTLM的缺乏是原因。到目前为止,我已经尝试了几种解决方案,但都没有效果

代码:

验证者

public class SharepointAuthenticator extends Authenticator {

private String username = "";
private String password = "";

public SharepointAuthenticator(String username, String password) {
    this.username = username;
    this.password = password;
    System.out.println("Initializing Authentication");
}

@Override
public PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(username, password.toCharArray());
}
}
拿肥皂

protected CopySoap getCopySoap(String username, String password, String wsdl, String endpoint) throws Exception {
    System.out.println("Creating a CopySoap instance...");
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
    Copy service = new Copy(new URL(wsdl), new QName("http://schemas.microsoft.com/sharepoint/soap/", "Copy"));
    System.out.println("CopySoap 2");

    CopySoap copySoap = service.getCopySoap();

    System.out.println(endpoint + "\n" + wsdl);

    BindingProvider bp = (BindingProvider) copySoap;  
    bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username);
    bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
    bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint);
    return copySoap;
}
调用以上载文件:

    // make the call to upload
    port.copyIntoItems("null", destinationUrlCollection, metadata, byteArray, longHolder, resultHolder);
我正在使用框架创建端口。它将负责所有类型的身份验证。它也在JBoss中工作

它很容易实现。添加CXF依赖项并使用以下代码创建端口

示例代码:

InvocationHandlerImpl.java

public class InvocationHandlerImpl implements InvocationHandler
{
    CopySoap port;

    public InvocationHandlerImpl(CopySoap copySoap) {
        port = copySoap;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(port, args);
    }

}
public class SPCopyDriver
{

    public static void main(String[] args) {

        JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
        proxyFactory.setServiceClass(CopySoap.class);
        proxyFactory.setUsername("domain\\username");
        proxyFactory.setPassword("password");
        proxyFactory.setAddress("https://<<IP>>/_vti_bin/Copy.asmx");

        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setAutoRedirect(true);
        httpClientPolicy.setAllowChunking(false);

        Object port = proxyFactory.create();
        Client client = ClientProxy.getClient(port);
        HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
        httpConduit.setClient(httpClientPolicy);

        TLSClientParameters tls = new TLSClientParameters();
        tls.setDisableCNCheck(true);
        tls.setTrustManagers(new TrustManager[] { new TrustingX509TrustManager() });
        httpConduit.setTlsClientParameters(tls);

        port = Proxy.newProxyInstance(SPCopyDriver.class.getClassLoader(), new Class[] { CopySoap.class }, new InvocationHandlerImpl((CopySoap) port));

        CopySoap copySoap = (CopySoap) port;

    }

}
TrustingX509TrustManager.java

public class TrustingX509TrustManager implements X509TrustManager
{
    /**
     * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
     */
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        // return null will let jsse accept all certificates!
        return null;
    }

    /**
     * @see javax.net.ssl.X509TrustManager#checkClientTrusted(X509Certificate[],String authType)
     */
    @Override
    public void checkClientTrusted(X509Certificate[] certs, String authType) {
    }

    /**
     * @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[],String authType)
     */
    @Override
    public void checkServerTrusted(X509Certificate[] certs, String authType) {
    }
}
SPCopyDriver.java

public class InvocationHandlerImpl implements InvocationHandler
{
    CopySoap port;

    public InvocationHandlerImpl(CopySoap copySoap) {
        port = copySoap;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(port, args);
    }

}
public class SPCopyDriver
{

    public static void main(String[] args) {

        JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
        proxyFactory.setServiceClass(CopySoap.class);
        proxyFactory.setUsername("domain\\username");
        proxyFactory.setPassword("password");
        proxyFactory.setAddress("https://<<IP>>/_vti_bin/Copy.asmx");

        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setAutoRedirect(true);
        httpClientPolicy.setAllowChunking(false);

        Object port = proxyFactory.create();
        Client client = ClientProxy.getClient(port);
        HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
        httpConduit.setClient(httpClientPolicy);

        TLSClientParameters tls = new TLSClientParameters();
        tls.setDisableCNCheck(true);
        tls.setTrustManagers(new TrustManager[] { new TrustingX509TrustManager() });
        httpConduit.setTlsClientParameters(tls);

        port = Proxy.newProxyInstance(SPCopyDriver.class.getClassLoader(), new Class[] { CopySoap.class }, new InvocationHandlerImpl((CopySoap) port));

        CopySoap copySoap = (CopySoap) port;

    }

}
公共类SPCopyDriver
{
公共静态void main(字符串[]args){
JaxWsProxyFactoryBean proxyFactory=新的JaxWsProxyFactoryBean();
proxyFactory.setServiceClass(CopySoap.class);
proxyFactory.setUsername(“域\\用户名”);
proxyFactory.setPassword(“密码”);
proxyFactory.setAddress(“https:///_vti_bin/Copy.asmx");
HTTPClientPolicy HTTPClientPolicy=新的HTTPClientPolicy();
httpClientPolicy.setAutoRedirect(true);
httpClientPolicy.setAllowChunking(false);
对象端口=proxyFactory.create();
Client Client=ClientProxy.getClient(端口);
httpconductor=(httpconductor)client.getconductor();
setClient(httpClientPolicy);
TLSClientParameters tls=新的TLSClientParameters();
tls.setDisableCNCheck(真);
tls.setTrustManager(new TrustManager[]{new TrustingX509TrustManager()});
HTTPC管道沉降参数(tls);
port=Proxy.newProxyInstance(SPCopyDriver.class.getClassLoader(),新类[]{CopySoap.class},新调用HandlerImpl((CopySoap)端口));
CopySoap CopySoap=(CopySoap)端口;
}
}

很抱歉延迟接受。这看起来很好,很有希望。目前正在处理其他项目,因为这一特定项目被搁置。稍后将更新状态。再次感谢。我实现了你的建议。我让它在我的IDE中工作,但是当部署到运行AdobeLiveCycle的Jboss中时,我得到了以下错误:NullPointerException@org.apache.cxf.jaxb.Util.getFieldXJTS@Line 269抱歉,我以前没有看到这个异常。这对我来说很好。是的,谷歌也没有发现任何东西。我现在正在采取另一种方式,将LiveCycle从图片中删除,以避免进一步的麻烦