我知道有很多问题,但问题是,我搜索并搜索了它周围的一切,但没有发现可以帮助我。
我尝试使用Apache CXF / Wildfly 8x / Java 1.7 / Maven 3 + / Eclipse实现基于SOAP的Web服务客户端。
我成功生成了代理类,实现了ws-security选项,添加了keystore和trustore,但发现了一个非常奇怪的问题。
[io.undertow.request] (default task-18) UT005023: Exception handling request to /service/DummyServiceCaller: java.lang.NoClassDefFoundError: org/apache/cxf/frontend/ClientProxy
at com.ddrc.service.Service.core.config.ServiceManager.beforeExecute(ServiceManager.java:17) [:]
at com.ddrc.service.service.core.ServiceManager.executeService(ServiceServiceManager.java:36) [:]
at com.ddrc.service.DummyServiceCaller.doGet(DummyServiceCaller.java:37) [:]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.jrHandle(ServletInitialHandler.java) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at org.zeroturnaround.javarebel.integration.servlet.undertow.cbp.ServletInitialHandlerCBP.handleRequest(ServletInitialHandlerCBP.java:100) [undertow-servlet-jr-plugin-6.2.7.jar:]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [jrebel-bootstrap-39173be574c0f43be80eb922241c6711.jar:1.7.0_75]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [jrebel-bootstrap-39173be574c0f43be80eb922241c6711.jar:1.7.0_75]
at java.lang.Thread.run(Thread.java:745) [jrebel-bootstrap-39173be574c0f43be80eb922241c6711.jar:1.7.0_75]
当我读到有关该异常时,它意味着,
这是因为您的代码所依赖的类文件 它出现在编译时但在运行时找不到。寻找 构建时和运行时类路径的差异。
大多数用例不再需要ClientProxy.getClient(代理)。 客户端代理实例现在直接实现客户端API。一个 直接投到客户应该工作。
我甚至不知道如何开始修复它,如何调试它。这是我写的代码。
private void adjustServiceConfiguration(Object port, String address) throws IOException {
org.apache.cxf.endpoint.Client client = ClientProxy.getClient(port);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(/* uccConnectionTimeout.value() */6 * 1000);
httpClientPolicy.setReceiveTimeout(/* uccTimeout.value() */7 * 1000);
http.setClient(httpClientPolicy);
((BindingProvider) port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, address);
((BindingProvider) port).getRequestContext().put("set-jaxb-validation-event-handler", "false");
Map<String, Object> outProps = new HashMap<>();
outProps.put(WSHandlerConstants.ACTION, "Timestamp Signature Encrypt");//
outProps.put(WSHandlerConstants.PASSWORD_TYPE, "PasswordDigest");
outProps.put(WSHandlerConstants.USER, "ucc-agent");
outProps.put(WSHandlerConstants.SIGNATURE_USER, "ucc-agent");
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, "com.ddrc.service.service.ws.KeyStorePasswordsCallback");
outProps.put(WSHandlerConstants.ENCRYPTION_USER, "ucc");
if (encryptionProps == null || signProps == null) {
try {
encryptionProps = new Properties();
signProps = new Properties();
try (FileInputStream fis1 = new FileInputStream(
uccEncryptionPropFile);
FileInputStream fis2 = new FileInputStream(
uccSignaturePropFile);) {
encryptionProps.load(fis1);
signProps.load(fis2);
}
} catch (IOException ex) {
throw ex;
// log.error("Error occurred during UCC WS-Security configuration file lookup",
// ex);
}
}
outProps.put("encryptionProps", encryptionProps);
outProps.put("signProps", signProps);
outProps.put(WSHandlerConstants.ENC_PROP_REF_ID, "encryptionProps");
outProps.put(WSHandlerConstants.SIG_PROP_REF_ID, "signProps");
Map<String, Object> inProps = new HashMap<>();
inProps.put(WSHandlerConstants.ACTION, "Timestamp Signature Encrypt");
inProps.put(WSHandlerConstants.PASSWORD_TYPE, "PasswordText");
inProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, "com.ddrc.service.service.ws.KeyStorePasswordsCallback");
inProps.put(WSHandlerConstants.ALLOW_RSA15_KEY_TRANSPORT_ALGORITHM, "true");
inProps.put("signProps", signProps);
inProps.put("encryptionProps", encryptionProps);
inProps.put(WSHandlerConstants.DEC_PROP_REF_ID, "signProps");
inProps.put(WSHandlerConstants.SIG_PROP_REF_ID, "encryptionProps");
client.getInInterceptors().add(new WSS4JInInterceptor(inProps));
client.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));
client.getInInterceptors().add(new LoggingInInterceptor());
client.getOutInterceptors().add(new LoggingOutInterceptor());
}
问题出在ClientProxy
class
这是小项目的错误。
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/cxf/common/i18n/UncheckedException
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at ge.test.Run.main(Run.java:16)
Caused by: java.lang.ClassNotFoundException: org.apache.cxf.common.i18n.UncheckedException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 13 more
和全班:)
package ge.test;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
public class Run {
public static void main(String[] args) {
Client c = ClientProxy.getClient(null);
}
}