代码之家  ›  专栏  ›  技术社区  ›  Kirill

架构元素引用未定义的类型。创建SOAP客户端服务。如何考虑生成类的绑定定制?

  •  0
  • Kirill  · 技术社区  · 8 年前

    我已经将WSDL转换为Java类,但是,我需要使用添加的绑定文件和后缀来解决冲突。然而,我成功地接收到了类型名称略有更改的类。 当我尝试使用JaxWsProxyFactoryBean创建WebService时,我放置了具有源名称的源WSDL的URL,它会出现如下错误:

    错误6792---[nio-5500-exec-1] o、 a.c.w.s.f.ReflectionServiceFactoryBean:模式元素 { http://tempuri.org/ }SearchMagistratesCourtRequest引用 未定义类型SearchMagistratesCortRequest for service { http://tempuri.org/ }WebServiceService。

    这是正确的,因为我生成的类名为“SearchMagistratesCourtRequestType”-末尾是“Type”。

    因此,我的绑定文件使用了以下自定义项:

    <jaxb:bindings schemaLocation="../xsd/egrul.xsd">
        <jaxb:schemaBindings>
            <jaxb:package name="ru.spi2.javaee.custom.pravoru.classes.egrul"/>
            <jaxb:nameXmlTransform>
                <jaxb:typeName suffix="Type"/>
                <jaxb:elementName suffix="Element"/>  //this one is not needed actually
            </jaxb:nameXmlTransform>
        </jaxb:schemaBindings>
    </jaxb:bindings>
    

    这里使用了后缀。

    我创建的WebService如下所示:

        JaxWsProxyFactoryBean portFactory = new JaxWsProxyFactoryBean();
        portFactory.setAddress(WSDL_URL);
        portFactory.setServiceClass(WebService.class);
    
        webService = (WebService) portFactory.create();
    

    在这里,我放置了源WSDL\u URL并接收所描述的错误。

    在这里,我如何考虑用于生成Java类的绑定定制?或者解决方案是什么?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Kirill    8 年前

    此问题已通过服务的另一次初始化得到解决。装订工作正常。 因此,在我的例子中,SOAP服务的正确工作初始化如下:

    private void initiateService() throws Exception{
    
        WebService_Service webService_service = new WebService_Service();
    
        webService_service.setHandlerResolver(new HandlerResolver() {
            @Override
            public List<Handler> getHandlerChain(PortInfo portInfo) {
                List<Handler> handlerList = new ArrayList<>();
                SOAPLoggingHandler soapLoggingHandler = new SOAPLoggingHandler();
                handlerList.add(soapLoggingHandler);
                return handlerList;
            }
        });
    
        webServicePort = webService_service.getPort(WebService.class);
    
        Client client = ClientProxy.getClient(webServicePort);
    
        Endpoint cxfEndpoint = client.getEndpoint();
    
        Map<String, Object> props = ((BindingProvider) webServicePort).getRequestContext();
        props.put("ws-security.username", PravoRuConstants.USERNAME);
        props.put("ws-security.password", PravoRuConstants.PASSWORD);
    
        props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        props.put(WSHandlerConstants.USER, PravoRuConstants.USERNAME);
        props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
    
        props.put(WSHandlerConstants.PW_CALLBACK_CLASS, PravoRuPasswordHandler.class.getName());
    
        WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
        cxfEndpoint.getOutInterceptors().add(wssOut);
    
    }
    

    SOAPLoggingHandler:

    import javax.xml.namespace.QName;
    import javax.xml.soap.SOAPException;
    import javax.xml.soap.SOAPMessage;
    import javax.xml.ws.handler.MessageContext;
    import javax.xml.ws.handler.soap.SOAPHandler;
    import javax.xml.ws.handler.soap.SOAPMessageContext;
    import java.io.IOException;
    import java.util.Set;
    
    public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {
        @Override
        public Set<QName> getHeaders() {
            return null;
        }
    
        @Override
        public boolean handleMessage(SOAPMessageContext context) {
            SOAPMessage message= context.getMessage();
            boolean isOutboundMessage = (Boolean)context.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);
            if(isOutboundMessage){
                System.out.println("OUTBOUND MESSAGE\n");
    
            }else{
                System.out.println("INBOUND MESSAGE\n");
            }
            try {
                message.writeTo(System.out);
            } catch (SOAPException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return true;
    
        }
    
        @Override
        public boolean handleFault(SOAPMessageContext context) {
            SOAPMessage message= context.getMessage();
            try {
                message.writeTo(System.out);
            } catch (SOAPException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return true;
        }
    
        @Override
        public void close(MessageContext context) { }
    }
    

    PravoRuPasswordHandler:

    import com.kirillch.constants.PravoRuConstants;
    import org.apache.wss4j.common.ext.WSPasswordCallback;
    
    import javax.security.auth.callback.Callback;
    import javax.security.auth.callback.CallbackHandler;
    import javax.security.auth.callback.UnsupportedCallbackException;
    import java.io.IOException;
    
    public class PravoRuPasswordHandler implements CallbackHandler {
        @Override
        public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
    
            WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
            pc.setPassword(PravoRuConstants.PASSWORD);
    
    
            //      for(int i=0; i<callbacks.length; i++) {
            //          WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
            //          if(pc.getIdentifier().equals(PravoRuConstants.USERNAME)){
            //              pc.setPassword(PravoRuConstants.PASSWORD);
            //              return;
            //          }
            //      }
    
        }
    }
    
    推荐文章