8

我对 Apache CXF 和 tomcat 相当陌生。我正在尝试构建一个简单的 Web 服务并将其部署在 tomcat 上。下面是我的 web.xml 但是,当我尝试使用浏览器访问“服务”文件夹时,它说没有找到服务。我尝试创建 java web 服务客户端,但它也无法找到该服务。这有什么问题?

<?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>
4

3 回答 3

7

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 e.g.:

<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 e.g.:

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

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

Your CandidateImpl class should have @WebService annotation. For e.g.:

@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:

于 2013-02-28T10:51:20.100 回答
1

您需要在 web.xml 中配置一个 servlet。下面举个例子。

<?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>

现在您需要在 WEB-INF 文件夹下定义一个名为 spring-ws-servlet.xml 的文件。下面是 spring-ws-servlet.xml 内容的示例,其中包含 Web 服务的实际配置。当然,这取决于您的逻辑:

<?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>

有了这个,您可以在http://localhost:8080/services/person?wsdl下访问您的 Web 服务

这是取自这篇文章。这是一个关于使用 IntelliJ Idea 和 Spring 创建 Cxf 服务的教程

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

于 2015-01-22T18:46:32.537 回答
1

您需要设置 spring 配置文件位置才能使其工作。您可以按如下方式进行设置。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>
于 2013-07-17T15:08:04.070 回答