配置Apache CXF

时间:2016-08-08 09:07:18

标签: java web-services cxf

我尝试在我的项目中使用Apache CXF。所以我设置了一个xml文件cxf-client.xml,其中我放了这段代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
   xsi:schemaLocation="http://cxf.apache.org/transports    /http/configuration
       http://cxf.apache.org/schemas/configuration/http-conf.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

       <import resource="classpath:META-INF/cxf/cxf.xml" />
       <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
       <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

       <http-conf:conduit name="*.http-conduit">
       <http-conf:client ConnectionTimeout="3000" ReceiveTimeout="3000"/>
       </http-conf:conduit>
</beans>

我的问题是我如何以及在何处阅读此文件以正确执行我的项目?我需要更多配置吗?

这是我的客户端类java:

@WebServiceClient(name = "name", 
              wsdlLocation = "sourse?wsdl",
              targetNamespace = "myNameSpace") 
public class MyClass extends Service {

public final static URL WSDL_LOCATION;

public final static QName SERVICE = new QName("myNameSpace", "name");
public final static QName MyEndpointServiceImplPort = new QName("myNameSpace", "MyEndpointServiceImplPort");
static {
    URL url = null;
    try {
        String urlString = System.getProperty("webservice.trainmission.url");
        url = new URL(urlString);
    } catch (MalformedURLException e) {
        e.getMessage();
    }
    WSDL_LOCATION = url;
}

public MyClass(URL wsdlLocation, QName serviceName) {       
    super(wsdlLocation, serviceName);
}
@WebEndpoint(name = "MyEndpointServiceImplPort")
public MyEndpointServicePortType getMyEndpointServiceImplPort() {
    return super.getPort(MyEndpointServiceImplPort,    MyEndpointServicePortType.class);
}

这是我的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns="http://java.sun.com/xml/ns/javaee"   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com /xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>MyProject</display-name>
<context-param>
  <param-name>contextConfigLocation</param-name>
<param-value>
        classpath:conf/cxf-client.xml
</param-value>
</context-param>
<servlet>
  <description>Apache CXF Endpoint</description>
  <display-name>cxf</display-name>
  <servlet-name>cxf</servlet-name>
  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-  class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>cxf</servlet-name>
  <url-pattern>/services/*</url-pattern>
</servlet-mapping>

<listener>
  <display-name>Spring Web Context Loader Listener</display-name>
  <listener-class>org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>
</web-app>

当我创建MyClass的实例时,它在此行super(wsdlLocation, serviceName);中被阻止,并且它不使用我配置它的超时

1 个答案:

答案 0 :(得分:0)

当构造函数尝试从wsdlLocaltion下载WSDL时,似乎您的服务被阻止。 CXF超时不适用于此处。确保wsdlLocation的URL是可访问的。如果不是

1)指向本地wsdl文件。

File wsdlFile = new File(wsdl);
wsdlLocation = wsdlFile.toURI().toURL();

2)配置不带WDSL的CXF Web服务

请参阅https://stackoverflow.com/a/19827446/6371459

QName qname = new QName("http://thenamespace", "FooService");
FooService service = new FooService(null, qname); // null for ignore WSDL
Foo port = service.getFooPort();
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext()
   .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
   "http://foo.com/soap/fooBean");