简体   繁体   中英

Apache CXF and tomcat

I am fairly new to Apache CXF and tomcat. I am trying to build a simple web service and deploy it on tomcat. below is my web.xml However when I try to access the 'services' folder using my browser it says No services have been found. I tried creating java web service client but it is not able to locate the service either. What could be wrong in this?

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>Sample web service provider</display-name>
    <listener>
        <!-- For Metro, use this listener-class instead: 
             com.sun.xml.ws.transport.http.servlet.WSServletContextListener -->
        <listener-class>
              org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <!-- Remove below context-param element if using Metro -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
              classpath:META-INF/cxf/cxf.xml
        </param-value>
    </context-param>
    <servlet>
        <servlet-name>WebServicePort</servlet-name>
        <!-- For Metro, use this servlet-class instead: 
             com.sun.xml.ws.transport.http.servlet.WSServlet  -->
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>WebServicePort</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>
</web-app>

This means that you don't have any services exposed in your application. Your web.xml seems to be correct but I've just missed one thing, your Spring configuration. Add your Spring config location in your web.xml , for eg:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>

Also, you have to create a class which will implement your web service interface and expose it as the CXF endpoint in your Spring applicationContext.xml configuration file. For eg:

<bean id="candidateImpl" class="some.pckg.CandidateImpl"/>

<jaxws:endpoint id="candidateEndpoint"
                implementor="#candidateImpl"
                address="/Candidate"
        />

Your CandidateImpl class should have @WebService annotation. For eg:

@WebService(targetNamespace = "http://something.com/ws/candidate",
        portName = "CandidateService",
        serviceName = "Candidate",
        endpointInterface = "some.pckg.types.CandidateService",
        wsdlLocation = "WEB-INF/wsdl/CandidateService.wsdl")
public class CandidateImpl implements CandidateService {
     //Implementation of all methods from CandidateService.
}

If you've done everything correctly you should see that there is one service available under:

http(s)://whateverhost.com:<somePort>/SomeContextPath/services

And you should be able to get the WSDL file like this:

http(s)://whateverhost.com:<somePort>/SomeContextPath/services/Candidate?wsdl

See also:

You need to set the spring configuration file location to make this work. You can set it as follows.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>

You need to configure a servlet in your web.xml. Below an example.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
       PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
       "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

   <servlet>
       <servlet-name>CXFServlet</servlet-name>
       <display-name>CXF Servlet</display-name>
       <servlet-class>
           org.apache.cxf.transport.servlet.CXFServlet
       </servlet-class>
       <init-param>
           <param-name>config-location</param-name>
           <param-value>/WEB-INF/spring-ws-servlet.xml</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
       <servlet-name>CXFServlet</servlet-name>
       <url-pattern>/services/*</url-pattern>
   </servlet-mapping>

</web-app>

Now you need to define a file named spring-ws-servlet.xml under WEB-INF folder. Below an example of the content of spring-ws-servlet.xml, which contains the actual configuration for your web service. This depends on your logic, of course:

<?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:context="http://www.springframework.org/schema/context"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.2.xsd
       http://cxf.apache.org/jaxws
       http://cxf.apache.org/schemas/jaxws.xsd">

   <context:component-scan base-package="com.sample.service"/>

   <!-- JAX-WS Service Endpoint -->
   <bean id="personImpl" class="com.sample.service.impl.PersonServiceImpl"/>

   <jaxws:endpoint id="personEndpoint"
                   implementor="#personImpl"
                   address="/person">
       <jaxws:properties>
           <entry key="schema-validation-enabled" value="true"/>
       </jaxws:properties>
   </jaxws:endpoint>
   <!-- JAX-WS Service Endpoint End-->
</beans>

With this, you can access your web service under http://localhost:8080/services/person?wsdl

This is taken from this post. It is a tutorial about creating a Cxf service with IntelliJ Idea and Spring

https://aldavblog.wordpress.com/2015/01/22/creating-a-web-service-from-scratch-using-spring-maven-apache-cxf/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM