使用Jersey Client发请求时如何格式化JSON请求体,有无对应Jackson注解?
问题原因
你当前的配置没有生效,核心有两个原因:
- 你调用
enable(SerializationFeature.INDENT_OUTPUT)是在反序列化(readValue)的流程中,该配置属于序列化参数,反序列化阶段设置不会生效 - Jersey Client默认使用内置初始化的
ObjectMapper实例序列化请求实体,不会复用你自己创建的ObjectMapper对象,所以你的配置没有被用到
实现方案
方案1:用Jackson注解单独给指定类开启格式化
Jackson 2.8及以上版本支持直接在实体类上加@JsonFormat注解实现单独格式化,不需要修改全局配置:
import com.fasterxml.jackson.annotation.JsonFormat; @JsonFormat(with = JsonFormat.Feature.PRETTY_PRINT) public class SomeRequestObject { // 类字段定义 }
这个方案只会作用于加了注解的类,不影响其他接口的请求序列化。
方案2:全局配置Jersey Client的Jackson序列化规则
如果你需要所有请求都输出格式化JSON,直接给Jersey客户端注册自定义配置的Jackson provider:
ObjectMapper customMapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT); JacksonJsonProvider jsonProvider = new JacksonJsonProvider(customMapper); restClient.register(jsonProvider);
配置后所有通过该restClient发出的JSON请求都会自动格式化。
方案3:手动序列化对象为格式化字符串
如果不想修改全局配置也不想加注解,可以自己先把对象序列化为格式化的JSON字符串,再传给请求体:
// 先自己序列化得到格式化JSON String prettyJson = getObjectMapper() .enable(SerializationFeature.INDENT_OUTPUT) .writeValueAsString(vSomeRequestObject); // 直接传入字符串作为请求体 return restClient.target(urlMap.get("uri")).path(urlMap.get("path")) .request(MediaType.APPLICATION_JSON) .headers(vRequestHeaders) .post(Entity.entity(prettyJson, MediaType.APPLICATION_JSON));
这个方案不会依赖Jersey的序列化逻辑,100%可控。
内容的提问来源于stack exchange,提问作者ViS
相关产品推荐
相关产品推荐

