如何在RestEasy Client中配置Json-B以指定Base64字节数组处理策略?
如何在RestEasy Client中配置Json-B以指定Base64字节数组处理策略?
我完全理解你碰到的问题——用RestEasy客户端处理JSON时,Yasson默认会把字节数组解析成int数组,导致原本Base64编码的二进制数据处理出错。你尝试的ContextResolver在JAX-RS服务器端通常能正常工作,但客户端的配置逻辑和服务器端不太一样,所以才会没效果。下面给你几个可行的解决方案:
方案一:直接构建配置好的Jsonb并注册到客户端
这是最直接且不易出错的方式,不用依赖ContextResolver,直接把配置好的Jsonb实例传给客户端:
- 先创建带有Base64策略的Jsonb配置和实例:
JsonbConfig jsonbConfig = new JsonbConfig() .withBinaryDataStrategy(BinaryDataStrategy.BASE_64); Jsonb jsonb = JsonbBuilder.newBuilder().withConfig(jsonbConfig).build();
- 构建RestEasy客户端时,注册这个配置好的Jsonb提供者:
Client client = ClientBuilder.newBuilder() .register(new JsonbProvider(jsonb)) .build();
这样客户端在序列化和反序列化JSON时,就会自动用这个配置来处理字节数组了。
方案二:修正ContextResolver并显式注册
如果你更倾向于用ContextResolver来管理配置,需要做两个调整:
- 给你的
JSONConfigurator添加@Consumes注解,因为客户端既要处理请求(生产JSON)也要处理响应(消费JSON):
@Provider @Priority(99) @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) // 新增这个注解 public class JSONConfigurator implements ContextResolver<Jsonb> { @Override public Jsonb getContext(Class<?> type) { JsonbConfig config = new JsonbConfig() .withBinaryDataStrategy(BinaryDataStrategy.BASE_64); return JsonbBuilder.newBuilder() .withConfig(config) .build(); } }
- 构建客户端时,显式注册这个Resolver类:
Client client = ClientBuilder.newBuilder() .register(JSONConfigurator.class) .build();
这样客户端的JAX-RS运行时才能找到并使用这个配置。
额外检查:确保依赖齐全
别忘了确认项目中已经引入了RestEasy的Json-B集成依赖,否则RestEasy不会默认使用Json-B作为JSON处理器。比如Maven项目可以添加:
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jsonb-provider</artifactId> <version>你的RestEasy版本号</version> </dependency>
总结一下,方案一的配置方式更直接,能快速解决问题;方案二更适合需要集中管理Json-B配置的场景。按照上面的步骤调整后,应该就能让Yasson正确处理Base64编码的字节数组了。
备注:内容来源于stack exchange,提问作者Superhugo
相关产品推荐
相关产品推荐

