我正在开发一个Web应用程序,它的servlet基本上充当Web服务的前端,我使用CXF作为Web服务客户端,应用程序在WebLogic 9.10服务器上运行,每个东西都工作正常,直到项目所有者决定添加ssl supprt,没什么大问题,因为我使用cxf whitout spring,我设法在服务客户端的http管道中配置TLS参数,还配置了一个密钥库,用于服务器密钥,ca根证书和客户端证书,在开发tomcat实例下测试并且工作正常.
当应用程序再次将应用程序重新部署到weblogic服务器并开始出现奇怪的错误时,问题就出现了,首先是:
java.lang.ClassCastException: com.sun.xml.ws.client.sei.SEIStub cannot be cast to org.apache.cxf.frontend.ClientProxy
at org.apache.cxf.frontend.ClientProxy.getClient
Run Code Online (Sandbox Code Playgroud)
然后我意识到weblogic正在加载它自己的JAX-WS实现,没有问题,只是添加了weblogic.xml whit"prefer-web-inf-classes"设置为true,重新部署,现在我得到了这个例外:
java.lang.LinkageError: loader constraint violation: when resolving method "javax.xml.ws.Service.<init>(Ljava/net/URL;Ljavax/xml/namespace/QName;)V" the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) of the current class, com/adinfi/imgsvc/cm/service/CMBGenericWebServiceService, and the class loader (instance of <bootloader>) for resolved class, javax/xml/ws/Service, have different Class objects for the type javax/xml/namespace/QName used in the signature
Run Code Online (Sandbox Code Playgroud)
那个人得到了我,我认为类路径有问题,所以我开始从应用程序中删除jar并仍然有更多的链接错误,最后一个我得到的是:
java.lang.LinkageError: loader constraint violation: loader (instance of <bootloader>) previously initiated loading for a different type with name "org/w3c/dom/UserDataHandler"
Run Code Online (Sandbox Code Playgroud)
这就是我的应用程序的"Web-Inf/lib /"目录现在的样子: …
我有一个程序,我在其中调用 jax-ws wsimport 函数生成的代码。它看起来是这样的:
HolidayService2 service = new HolidayService2();
HolidayService2Soap proxy = service.getHolidayService2Soap();
ArrayOfCountryCode countries = proxy.GetCountriesAvailable("USA");
Run Code Online (Sandbox Code Playgroud)
proxy.GetCountriesAvailable 方法调用 Web 服务并返回国家/地区代码数组。有什么方法可以在我的应用程序中显示原始肥皂响应吗?
谢谢你的帮助
我无法找到解决方案,而且我发现更多人遇到了同样的问题,所以我将其发布在这里。
默认情况下,JAX-WS 服务器(至少对于 WebLogic)不会验证接收到的消息及其关联模式。
这会导致很多问题,因为任何无效值(错误的 xsd:dateTime 格式、数字字段上的字母等)都将导致Java 对象中的空值,包括必填字段。
我需要做的是应该由服务器提供的简单验证。
import com.sun.xml.internal.ws.developer.SchemaValidation;
@Stateless
@WebService(portName="ValidatedService")
@SchemaValidation
public class ValidatedService {
public void operation(@WebParam(name="request") ValidatedRequest request) {
/* do stuff */
}
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我尝试使用提供的架构验证时,出现以下异常:
Caused By: javax.xml.ws.WebServiceException: Annotation @com.sun.xml.internal.ws.developer.SchemaValidation(handler=class com.sun.xml.internal.ws.server.DraconianValidationErrorHandler) is not recognizable, atleast one constructor of class com.sun.xml.internal.ws.developer.SchemaValidationFeature should be marked with @FeatureConstructor
Run Code Online (Sandbox Code Playgroud)
我不希望实现任何自定义验证器。服务器应该通过简单直接的配置来提供这种类型的服务。
我正在努力解决一个简单的JAXB定制问题.我有这样的架构.(它实际上是Bing Maps Web Services架构的一小部分)
<xs:complexType name="GeocodeOptions">
<xs:sequence>
<xs:element minOccurs="0" name="Count" nillable="true" type="xs:int" />
<xs:element minOccurs="0" name="Filters" nillable="true" type="ArrayOfFilterBase" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ArrayOfFilterBase">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="FilterBase" nillable="true" type="FilterBase" />
</xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
现在当我使用wsimport生成java类时,它创建了如下代码结构:
public class GeocodeOptions implements Serializable {
...
public ArrayOfFilterBase getFilters() {
...
}
public void setFilters(ArrayOfFilterBase value) {
...
}
}
public class ArrayOfFilterBase implements Serializable {
...
public List<FilterBase> getFilterBaseList() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所注意到的,ArrayOfFilterBase是一个容器类,我想省略它.我想直接在GeocodeOptions类中使用getFilterBaseList()方法.
是否可以通过JAXB定制来实现?我努力寻找它但找不到解决方案.
谢谢你的帮助.
关心Nabeel Mukhtar
这是我两天前问过的一个问题的链接,
我正在使用jaxws库.
该服务形成URL,然后在内部创建HTTPURLConnection.如果我能抓住连接,我可以将followRedirect设置为true.
但没有得到相同的处理.它的紧急,任何帮助将受到高度赞赏.
我有一个错误,我无法在我的webservice方法中理解.
首先,这是方法:
package com.ubb.damate.webservice;
import java.util.Date;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.ubb.damate.model.UserEvent;
import com.ubb.damate.model.UserEventPK;
import com.ubb.damate.service.UserEventServiceLocal;
import com.ubb.damate.util.DateUtils;
/** Session Bean implementation class UserEventWebService */
@Stateless
@WebService
public class UserEventWebService {
@EJB(beanName = "UserEventService")
private UserEventServiceLocal userEventService;
public String createOrUpdate(@WebParam(name = "Eventvalue") String eventvalue, @WebParam(name = "Username") String username, @WebParam(name = "Eventname") String eventname) {
Date date = DateUtils.createDate(-1, 1, 1);
UserEventPK userPk = new UserEventPK();
userPk.setEventname(eventname);
userPk.setUsername(username);
userPk.setEventdate(date);
UserEvent userEvent = new UserEvent();
userEvent.setId(userPk);
String …Run Code Online (Sandbox Code Playgroud) 我使用wsdlc ANT任务从wsdl创建了一个JAXWS Web服务,并部署在Weblogic 10.3.0中.我们有Sun one Java Server 7.0,其中安装了Verisign Server证书并配置为将webservice请求转发到weblogic.
我使用wsimport ant任务创建了一个JAXWS客户端来调用webservice.使用https URL运行客户端时,我可以看到weblogic中的xml请求,并成功处理了webservice.但我无法在xml请求/响应中找到任何x509证书的证据.除了使用wsimport生成存根之外,我是否需要在客户端执行任何操作?通过浏览器查看wsdl时,我可以通过浏览器查看证书详细信息.
我在 Netbeans 7.1.2 中使用了 Web 服务客户端向导,但是当我尝试调用其中一个方法时,我收到以下错误:
javax.xml.ws.soap.SOAPFaultException:异常:未启用压缩,此 Web 服务期望客户端支持 GZIP、Deflate 压缩
生成的骨架文件很多,我无法弄清楚如何启用压缩。有人可以建议吗?
非常感谢
我有一个类实现客户端过滤的ClientRequestFilter.
import java.io.IOException;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.client.ClientRequestFilter;
import org.glassfish.jersey.server.ContainerRequest;
@Provider
public class checkRequestFilter implements ClientRequestFilter{
@Override
public void filter(ClientRequestContext clientRequestContext) throws IOException {
System.out.println("I am in checkResponseFilter");
}
}
Run Code Online (Sandbox Code Playgroud)
但我不知道该怎么办,以便我可以调用这个过滤器?
我们需要在web.xml中添加某种servlet吗?
我正在处理一些旧的jax-ws东西。
过去,当使用XML时,我需要一个XSD / DTD模式,最好是闻起来像一个已发布的,永恒的 URL。
谷歌搜索之后,我能找到的只是http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/2.0/jaxws/sun-jaxws.xsd,其中带有短暂的气味。
<?xml version="1.0" encoding="UTF-8"?>
<endpoints
xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jax-ws/ri/runtime http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/2.0/jaxws/sun-jaxws.xsd"
version="2.0">
<endpoint implementation="io.earcam.example.jaxws.Hello" url-pattern="/hello" name="Hello" />
</endpoints>
Run Code Online (Sandbox Code Playgroud) 我试图通过https使用JAX-WS调用Web服务(使用C#开发).我试过通过SoapUI设置一个调用,这是有效的.
但是,当尝试通过生成的jax-ws客户端执行相同操作时,我得到的只是301响应.这类似于我使用带有http url到同一服务的SoapUI,而wireshark告诉我,我做了一个HTTP(HTTP/XML)POST操作.这让我相信,由于某种原因,我生成的JAX-WS客户端尝试通过http而不是https调用.
例示代码:
new MyServiceInterface(new URL("https://acme.com/services/MyService.svc?wsdl"))
.getMyPort().test();
Run Code Online (Sandbox Code Playgroud)
如您所见,我https在创建客户端时提供了一个URL.还有什么需要确保JAX-WS使用https吗?命名空间URI都是http,这会导致问题吗?
更新:
我已经使用接受的答案中的指南在问题中实现了对服务的SOAP请求:工作Soap客户端示例 几乎重复了来自SoapUI的信息,现在它给了我一个适当的200响应.
更新2:
在调试我的JAX-WS客户端时,我找到了这个属性:
"javax.xml.ws.service.endpoint.address" -> "http://acme.com/services/MyService.svc"
Run Code Online (Sandbox Code Playgroud)
这有http,而不是https.有关?
更新3:
使用调试器将"javax.xml.ws.service.endpoint.address"更改为https url而不是http时,我的客户端可以正常工作.但为什么它开始是http?
我正在使用 Java7 和 JAX-WS 2.2。
对于 SOAP Web 服务,我需要创建一个自定义X509KeyManager,以便为 JKS 密钥库中的每个连接客户端找到正确的证书。
但是,我已经在努力让我的自定义密钥管理器运行。到目前为止,我使用的是默认的(从初始化的 中检索KeyManagerFactory)并且它基本上可以工作 - 但当然它没有选择正确的证书。所以第一个想法是创建一个自定义X509KeyManager来保存原始密钥管理器,只写出一些日志消息,但通常使用默认行为。
出于某种原因,这根本不起作用。无法建立 SSL 握手。在ClientHello 之后,日志显示以下错误:
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
Thread-3, READ: TLSv1 Handshake, length = 149
*** ClientHello, TLSv1
RandomCookie: GMT: 1476877930 bytes = { 207, 226, 8, 128, 40, 207, 47, 180, 146, 211, 157, 64, 239, 13, 201, 92, 158, 111, 108, 44, …Run Code Online (Sandbox Code Playgroud)