如何在JAX-RPC WebService中创建soap:header?求完整分步指导
在JAX-RPC WebService中创建SOAP Header的分步指南
1. 定义SOAP Header对应的Java类
SOAP Header的数据需要封装成可序列化的Java类,JAX-RPC要求这类实现java.io.Serializable接口。示例如下:
import java.io.Serializable; public class AuthHeader implements Serializable { private String username; private String password; // 无参构造器(JAX-RPC要求必须提供) public AuthHeader() {} // 带参构造器 public AuthHeader(String username, String password) { this.username = username; this.password = password; } // Getter和Setter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
2. 创建WebService端点接口(SEI)
在接口的方法上使用@javax.xml.rpc.soap.SOAPHeaderParam注解,绑定SOAP Header到方法参数,指定Header的本地名称和命名空间:
import javax.jws.WebMethod; import javax.jws.WebService; import javax.xml.rpc.soap.SOAPHeaderParam; @WebService(targetNamespace = "http://example.com/webservices") public interface HelloWorldService { @WebMethod String sayHello( @SOAPHeaderParam(name = "AuthHeader", namespaceURI = "http://example.com/headers") AuthHeader authHeader, String name ); }
3. 实现WebService端点类
实现上述接口,在方法中直接使用传入的Header参数:
public class HelloWorldServiceImpl implements HelloWorldService { @Override public String sayHello(AuthHeader authHeader, String name) { // 示例凭证验证逻辑 if ("admin".equals(authHeader.getUsername()) && "123456".equals(authHeader.getPassword())) { return "Hello, " + name + "!"; } else { throw new RuntimeException("Invalid credentials in SOAP Header"); } } }
4. 生成WSDL和映射文件
使用JAX-RPC提供的wscompile工具生成WSDL和jaxrpc-mapping.xml映射文件。首先创建配置文件config.xml:
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config"> <service name="HelloWorldService" targetNamespace="http://example.com/webservices"> <implementation-class>com.example.HelloWorldServiceImpl</implementation-class> <wsdl-file>HelloWorldService.wsdl</wsdl-file> <mapping-file>jaxrpc-mapping.xml</mapping-file> </service> </configuration>
执行命令生成文件:
wscompile -config config.xml -gen:server -d ./output
-gen:server:生成服务端相关文件-d ./output:指定输出目录
生成的WSDL中会包含SOAP Header的定义,示例片段:
<wsdl:message name="sayHelloRequest"> <wsdl:part name="AuthHeader" element="ns1:AuthHeader" xmlns:ns1="http://example.com/headers"/> <wsdl:part name="name" type="xsd:string"/> </wsdl:message>
5. 配置WebService部署描述符(webservices.xml)
在WEB-INF/webservices.xml中配置服务端点,关联映射文件:
<webservices xmlns="http://java.sun.com/xml/ns/j2ee" version="1.1"> <webservice-description> <webservice-description-name>HelloWorldService</webservice-description-name> <wsdl-file>WEB-INF/wsdl/HelloWorldService.wsdl</wsdl-file> <jaxrpc-mapping-file>WEB-INF/jaxrpc-mapping.xml</jaxrpc-mapping-file> <port-component> <port-component-name>HelloWorldServicePort</port-component-name> <service-endpoint-interface>com.example.HelloWorldService</service-endpoint-interface> <service-impl-bean> <servlet-link>HelloWorldServlet</servlet-link> </service-impl-bean> </port-component> </webservice-description> </webservices>
同时在web.xml中配置对应Servlet:
<servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>com.sun.xml.rpc.server.http.JAXRPCServlet</servlet-class> <init-param> <param-name>javax.xml.rpc.service.endpoint.interface</param-name> <param-value>com.example.HelloWorldService</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/HelloWorldService</url-pattern> </servlet-mapping>
6. 客户端调用示例
生成客户端代码后,调用方法时直接传入Header对象:
import com.example.HelloWorldService; import com.example.HelloWorldService_Impl; import com.example.AuthHeader; public class HelloWorldClient { public static void main(String[] args) { HelloWorldService service = new HelloWorldService_Impl(); AuthHeader authHeader = new AuthHeader("admin", "123456"); String result = service.sayHello(authHeader, "Alice"); System.out.println(result); } }
内容的提问来源于stack exchange,提问作者Wens Sense
相关产品推荐
相关产品推荐

