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

Java中如何从WSDL使用Serializer?如何将WebService响应转为JSON?

我来帮你解决这两个Java Web服务相关的问题:

1. 如何在Java中从WSDL文件使用Serializer?

首先,当你通过WSDL生成Java客户端代码(常用工具比如JAX-WS的wsimport、Axis2的wsdl2java或者Apache CXF的代码生成器),生成的实体类一般已经自带基础的序列化支持。如果需要自定义序列化(比如转XML/JSON),可以按下面的步骤来:

  • 第一步:生成WSDL客户端代码
    先通过工具把WSDL转成Java类,比如用JAX-WS的命令行工具:

    wsimport -keep -p com.your.project.wsclient http://your-service-url/your.wsdl
    

    这个命令会生成服务接口、请求/响应实体类等文件,保存在指定的包下。

  • 第二步:选择合适的序列化库
    根据你的需求选对应的库:

    • 转XML:优先用JAXB(JAX-WS默认绑定,生成的类自带JAXB注解),也可以用XStream
    • 转JSON:Jackson、Gson是最常用的两个库,兼容性好
  • 第三步:实现序列化
    举个JAXB序列化XML的例子(和JAX-WS无缝集成):

    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import java.io.StringWriter;
    
    // 假设你调用服务后得到的响应对象是GeneratedResponse
    GeneratedResponse response = yourSoapService.yourMethod();
    
    try {
        // 初始化JAXB上下文,传入响应类的class
        JAXBContext context = JAXBContext.newInstance(GeneratedResponse.class);
        Marshaller marshaller = context.createMarshaller();
        // 开启格式化输出,让XML更易读
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
        StringWriter writer = new StringWriter();
        marshaller.marshal(response, writer);
        String xmlOutput = writer.toString();
        System.out.println(xmlOutput);
    } catch (JAXBException e) {
        e.printStackTrace();
    }
    

    如果要转JSON,用Jackson的话,因为生成的类有JAXB注解,需要注册对应的模块:

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
    
    ObjectMapper mapper = new ObjectMapper();
    // 注册JAXB注解支持,让Jackson能识别生成类的注解
    mapper.registerModule(new JaxbAnnotationModule());
    
    String jsonOutput = mapper.writeValueAsString(response);
    System.out.println(jsonOutput);
    
2. 将Web服务返回的对象转为JSON格式

你现在看到的org.tempuri.wynaws.wsother.Browse_1_1ResponseBrowse_1_1Result@41dd0e27是对象默认的toString()输出,只是打印了对象的内存地址,要转成可读的JSON,用JSON序列化库就能搞定,这里给你两个常用方案:

方案一:用Jackson库(业界主流)

1. 添加依赖

如果用Maven,在pom.xml里加这些依赖(用最新稳定版就行):

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.15.2</version>
    </dependency>
    <!-- 因为WSDL生成的类带JAXB注解,需要这个模块来支持 -->
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-jaxb-annotations</artifactId>
        <version>2.15.2</version>
    </dependency>
</dependencies>

2. 修改你的代码

把原来打印对象的代码改成序列化JSON的逻辑:

try {
    WsOtherLocator locator = new WsOtherLocator();
    WsOtherSoap soapws = locator.getWsOtherSoap();
    Browse_1_1ResponseBrowse_1_1Result result = soapws.browse_1("0040041100002","admin", "admin", "admin", "PKG_ADMIN.BRW_ADMIN_ID");
    
    // 初始化Jackson的ObjectMapper
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JaxbAnnotationModule());
    // 可选:只序列化非空的字段,精简JSON
    mapper.setSerializationInclusion(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL);
    
    // 把对象转成JSON字符串
    String jsonResult = mapper.writeValueAsString(result);
    System.out.println(jsonResult);
} catch (Exception ex){
    ex.printStackTrace();
}

方案二:用Gson库(Google出品,轻量易用)

1. 添加依赖

Maven依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

2. 修改代码

Gson的用法更简洁,不需要额外处理JAXB注解(它会自动识别字段):

try {
    WsOtherLocator locator = new WsOtherLocator();
    WsOtherSoap soapws = locator.getWsOtherSoap();
    Browse_1_1ResponseBrowse_1_1Result result = soapws.browse_1("0040041100002","admin", "admin", "admin", "PKG_ADMIN.BRW_ADMIN_ID");
    
    // 创建Gson实例,开启格式化输出(可选,让JSON更易读)
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String jsonResult = gson.toJson(result);
    System.out.println(jsonResult);
} catch (Exception ex){
    ex.printStackTrace();
}

注意点

  • 确保Browse_1_1ResponseBrowse_1_1Result类和它内部的所有嵌套类都有无参构造函数,这是大多数序列化库的要求。如果生成的类没有,你可以手动添加,或者用库的配置绕过(比如Jackson的MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)。
  • 如果某些字段你不想出现在JSON里,可以加注解:Jackson用@JsonIgnore,Gson用@Expose(serialize = false)(记得创建Gson时开启excludeFieldsWithoutExposeAnnotation())。

内容的提问来源于stack exchange,提问作者ezra putra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:57:26