簡體   English   中英

在具有 1 個 web.xml 文件的單個 tomcat 實例中運行 spring mvc web 應用程序和 jaxws soap web 服務

[英]running spring mvc web app and jaxws soap web service in single tomcat instance having 1 web.xml file

我正在做一個 zoho 到 quickbooks 的集成。 在其中,我為 quickbooks 桌面創建了 Web 應用程序和肥皂服務以與之通信。 我的 web 應用程序可以很好地使用 spring 注釋,但自動裝配的注釋不起作用。 我想知道你是否可以保留 web.xml 配置如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>zohoquickbooks</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <session-config>
    <session-timeout>2</session-timeout>
  </session-config>
  
  
  <servlet>
    <servlet-name>zohoquickbooksdispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/zohoquickbooks-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>zohoquickbooksdispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
  <listener>
    <listener-class>
        com.sun.xml.ws.transport.http.servlet.WSServletContextListener
    </listener-class>
  </listener> 
  
  <servlet>
    <servlet-name>qbservice</servlet-name>
    <servlet-class>
        com.sun.xml.ws.transport.http.servlet.WSServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>qbservice</servlet-name>
    <url-pattern>/qbservice</url-pattern>
  </servlet-mapping>
  
  
 
</web-app>

此配置有效。 web.xml 中的 jaxws 服務存在一個問題。 實現類的對象是由 jax-ws 容器而不是由 spring 啟動的,因此自動裝配該類中的其他對象不起作用。 您可以通過在此 URL“https://dzone.com/articles/autowiring-spring-beans-into-classes-not-managed-by-spring”中指定的方式將 spring 托管對象轉換為非 spring 托管對象。 否則,此配置工作正常。 您可以在同一端口上的同一容器上運行 Web 應用程序和肥皂服務。 只是url路徑需要不同。

沒有任何xml的spring boot很容易。

您可以使用依賴項:cxf-spring-boot-starter-jaxws。 https://mvnrepository.com/artifact/org.apache.cxf/cxf-spring-boot-starter-jaxws

它將您的 spring 服務與 jaxws 服務分開。 默認情況下,它將在 url 公開 jaxws 服務:http://localhost:8080/services

您可以在此處閱讀詳細信息https://cxf.apache.org/docs/springboot.html

import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;

@Configuration
public class ApacheCxfConfig {
    @Autowired
    private Bus bus;

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus, new NumberConversionSoapTypeImpl());
        endpoint.publish("/hello");
        return endpoint;
    }
}



@WebService(name = "NumberConversionSoapType", targetNamespace = "http://www.dataaccess.com/webservicesserver/")
@XmlSeeAlso({
    ObjectFactory.class
})
public interface NumberConversionSoapType {

    /**
     * Returns the word corresponding to the positive number passed as parameter. Limited to quadrillions.
     * 
     * @param ubiNum
     * @return
     *     returns java.lang.String
     */
    @WebMethod(operationName = "NumberToWords")
    @WebResult(name = "NumberToWordsResult", targetNamespace = "http://www.dataaccess.com/webservicesserver/")
    @RequestWrapper(localName = "NumberToWords", targetNamespace = "http://www.dataaccess.com/webservicesserver/", className = "az.soap.NumberToWords")
    @ResponseWrapper(localName = "NumberToWordsResponse", targetNamespace = "http://www.dataaccess.com/webservicesserver/", className = "az.soap.NumberToWordsResponse")
    public String numberToWords(
        @WebParam(name = "ubiNum", targetNamespace = "http://www.dataaccess.com/webservicesserver/")
        BigInteger ubiNum);

}


@Service
@WebService(name = "NumberConversionSoapType", targetNamespace = "http://www.dataaccess.com/webservicesserver/")
public class NumberConversionSoapTypeImpl implements NumberConversionSoapType {
    @Override
    public String numberToWords(BigInteger ubiNum) {
        System.out.println("numberToWords");
        return null;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM