首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JAX-WS 輕量級 Web Service 實戰:從零構建、Spring 整合到客戶端調用全流程

     編輯:Java 綜合教學

技術選型:為什麼選 JAX-WS?

  • 零依賴:JDK 6+ 內置,無需額外 JAR(生產建議補充 jaxws-rt 修復已知 Bug)。
  • 標準化:JSR 224 規範,代碼可移植至任何 Java EE 容器。
  • 輕量:無複雜配置文件,注解驅動,適合微服務/內部集成。
  • 對比:Axis2 重、依賴多;CXF 功能強但體積大;XFire/Axis 已停維護。

場景一:純 Servlet 環境發布(無 Spring)

1. Maven 依賴

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.3.3</version>
</dependency>

2. 服務接口與實現(注解驅動)

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC) // RPC 風格,文檔風格用 DOCUMENT
public interface MyFirstWebService {
    @WebMethod
    String sayHi(@WebParam(name = "name") String name);
}

@WebService(endpointInterface = "com.rambo.cwe.jws.inter.MyFirstWebService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class MyFirstWebServiceImpl implements MyFirstWebService {
    @Override
    public String sayHi(String name) {
        return "Hi, " + name + "!";
    }
}

3. web.xml 配置端點 Servlet

<listener>
    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
    <servlet-name>MyFirstWebService</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>MyFirstWebService</servlet-name>
    <url-pattern>/services/sayHi</url-pattern>
</servlet-mapping>

4. 端點發布配置:sun-jaxws.xml(放在 WEB-INF)

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="https://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
    <endpoint name="myFirstWebService"
              implementation="com.rambo.cwe.jws.impl.MyFirstWebServiceImpl"
              url-pattern="/services/sayHi"/>
</endpoints>

5. 驗證

啟動 Tomcat,訪問 https://localhost:8080/ctx/services/sayHi?wsdl 應顯示 WSDL 文檔。

場景二:Spring 整合(推薦生產使用)

1. 額外依賴

<dependency>
    <groupId>org.springframework.ws</groupId>
    <artifactId>spring-ws-core</artifactId>
    <version>3.1.0</version>
</dependency>

2. Spring XML 配置

<!-- 自動發布所有 @WebService Bean -->
<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
    <property name="baseAddress" value="https://localhost:8089/services/"/>
</bean>

<!-- 服務實現 Bean -->
<bean id="myFirstWebServiceImpl" class="com.rambo.cwe.jws.impl.MyFirstWebServiceImpl"/>

或使用注解 @Component + 掃描。啟動 Spring 容器即自動發布。

客戶端調用三種方式

方式 1:wsimport 生成代理類(標準、類型安全)

wsimport -keep -p com.client.proxy https://localhost:8080/ctx/services/sayHi?wsdl
MyFirstWebServiceImplService service = new MyFirstWebServiceImplService();
MyFirstWebService port = service.getMyFirstWebServiceImplPort();
System.out.println(port.sayHi("Orson"));

方式 2:動態調用(無生成代碼,僅需接口 Jar)

URL wsdlUrl = new URL("https://localhost:8080/ctx/services/sayHi?wsdl");
QName serviceName = new QName("https://impl.jws.cwe.rambo.com/", "MyFirstWebServiceImplService");
QName portName = new QName("https://impl.jws.cwe.rambo.com/", "MyFirstWebServiceImplPort");

Service service = Service.create(wsdlUrl, serviceName);
MyFirstWebService port = service.getPort(portName, MyFirstWebService.class);
System.out.println(port.sayHi("Orson"));

方式 3:Dispatch 低層 API(完全控制 XML/Source)

Dispatch dispatch = service.createDispatch(portName, Source.class, Service.Mode.PAYLOAD);
DOMSource request = ... // 構建 SOAP Body
Source response = dispatch.invoke(request);

常見坑與解決

問題解決
WSDL 訪問 404檢查 url-pattern、sun-jaxws.xml、endpointInterface 三者一致
中文亂碼確保 JDK/容器編碼 UTF-8,SOAP 消息頭 Content-Type: text/xml; charset=utf-8
附件傳輸 (MTOM)接口加 @MTOM,客戶端 ((BindingProvider)port).getRequestContext().put("mtom-enabled", true)
超時設置((BindingProvider)port).getRequestContext().put("com.sun.xml.ws.connect.timeout", 5000);
安全認證配置 WS-Security (WSS4J) 或 HTTP Basic Auth 於 BindingProvider

總結

JAX-WS 以「內置、標準、輕量」三大優勢,成為 Java 內部 SOAP/Web Service 集成的首選。掌握「純 Servlet 發布」「Spring 整合」「三種客戶端調用」三大場景,配合 wsimport 代碼生成,即可應對 90% 以上的企業級集成需求。下次跨語言、跨平台對接時,拋出一個 WSDL 地址,世界就安靜了。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved