You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:00:13