无法将原始值传递给我的自定义SOAPHandler类

时间:2013-12-19 05:54:54

标签: java

我编写了自定义soaphandler类,它扩展了javax.xml.rpc.GenericHandler。我的要求是将原始变量从我的其他调用者java类传递到此处理程序类中。这个变量应该在运行时传递并且应该是线程安全的,因为多个线程将同时访问该处理程序。

我试图将值存储到HandlerConfig对象中并将其注入HandlerInfo,但我在处理程序中找不到此值。

这个Soap Handler概念对我来说是新的,所以请帮我解决这个问题。 下面我发布了处理程序类的原始代码和我调用它的类。

public class MilerHandler extends GenericHandler {

    private HandlerInfo info;
    private static final String AUTHORIZATION = "Authorization";
    private static final String DATE = "Date";
    private static final String URI = "http://-----.com";
   public MilerHandler() {
         }

    public void init(HandlerInfo info) {
        this.info = info;
    }

    public QName[] getHeaders() {
        return info.getHeaders();
    }

    public boolean handleRequest(MessageContext context) {
        SOAPMessageContext smc = (SOAPMessageContext)context;
        SOAPMessage message = smc.getMessage();
        try {
            SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
            SOAPFactory factory = SOAPFactory.newInstance();

            SOAPElement authorization =  factory.createElement(AUTHORIZATION, PCMilerClientService.PREFIX, URI);
            SOAPElement date = factory.createElement(DATE, PCMilerClientService.PREFIX, URI);
            authorization.addTextNode((String)value1); //Value1 need to be pass from my business class.
            date.addTextNode((int)value2);          //Value2 need to be pass from my business class.
            SOAPElement authHeader = factory.createElement(PCMilerClientService.AUTH_HEADER, PCMilerClientService.PREFIX, URI);
            authHeader.addChildElement(authorization);
            authHeader.addChildElement(date);
            SOAPHeader header = envelope.getHeader();
            header.addChildElement(authHeader);
            message.saveChanges();
            if(log.debug()) {
                log.debug(message);
            }
        }
        catch (Exception ex) {
            log.error(ex);
        }
        return true;
    }

    public boolean handleResponse(javax.xml.rpc.handler.MessageContext context) {
        SOAPMessageContext smc = (SOAPMessageContext)context;
        SOAPMessage message = smc.getMessage();
        if(log.debug()) {
            log.debug(message);
        }
        return true;
    }

    public boolean handleFault(javax.xml.rpc.handler.MessageContext context) {
        SOAPMessageContext smc = (SOAPMessageContext)context;
        SOAPMessage message = smc.getMessage();
        if(log.debug()) {
            log.debug(message);
        }
        return true;
    }
}



public class MilerDistanceLookupWorker  {

    public void run() {
        IService_Stub stub = null;
        Service_Impl impl = null;
        try {
                impl = new Service_Impl();
                setPCMilerHandler(impl);
                stub = (IService_Stub) impl.getBasicHttpBinding_IService();
                  } catch (ServiceException e) {
            -----------------
        }
    }

    private void setMilerHandler(Service_Impl impl) {
    HandlerInfo handlerInfo = new HandlerInfo();
        handlerInfo.setHandlerClass(MilerHandler.class);
        QName authHeader = new QName(NAMESPACE, AUTH_HEADER, PREFIX);
        List<HandlerInfo> headerList = impl.getHandlerRegistry().getHandlerChain(authHeader);
        headerList.add(handlerInfo);
        impl.getHandlerRegistry().setHandlerChain(authHeader, headerList);
    }
}

1 个答案:

答案 0 :(得分:0)

如果您正在尝试实现SOAP auth处理程序,那么您需要执行以下操作:

public class SOAPAuthenticationHandler implements SOAPHandler<SOAPMessageContext> {

    private String username;
    private String password;

    public SOAPAuthenticationHandler (String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public boolean handleMessage(SOAPMessageContext smc) {
        Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (!outboundProperty) {
            return outboundProperty;
        }
        try {
            SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
            SOAPHeader header = envelope.addHeader();
            SOAPElement security = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
            security.addNamespaceDeclaration("common", "some xmlns");
            SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse");
            usernameToken.addAttribute(new QName("xmlns:wsu"), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
            SOAPElement usernameElement = usernameToken.addChildElement("Username", "wsse");
            usernameElement.addTextNode(username);
            SOAPElement passwordElement = usernameToken.addChildElement("PasswordSaltedDigest", "common");
            passwordElement.setAttribute("Type", "http://www.w3.org/2001/04/xmldsig-more#gostr341194");
            passwordElement.addTextNode(password);
        } catch (SOAPException | DOMException e) {
            getLogger().error(e.getMessage());
        }
        return outboundProperty;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return false;
    }

    @Override
    public void close(MessageContext context) {
    }

    @Override
    public Set<QName> getHeaders() {
        return null;
    }
}

之后,您需要将此处理程序添加到端口“HandlerChain

List handlerChain = ((BindingProvider) port).getBinding().getHandlerChain();
if (handlerChain == null) {
    handlerChain = new ArrayList();
}
handlerChain.add(new SOAPAuthenticationHandler(username, password));
((BindingProvider) port).getBinding().setHandlerChain(handlerChain);