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
相关产品推荐
相关产品推荐

