JAX-RS:对遗留对象的JSON反序列化-如何为遗留接口提供帮助器/工厂?

时间:2019-07-08 13:49:23

标签: java json jax-rs jsonb tomee

在构建用于测试旧系统的新编写的客户端的存根测试服务器时,我遇到一种情况,我想将传入的JSON请求主体反序列化为供应商为同一旧系统提供的对象层次结构。 / p>

换句话说,我想使用vendors类而不是构建自己的类。

我设法使Eclipse Microplatform客户端(在最新的TomEE中运行)可以开始填充基本的旧对象,但是由于无法实例化该对象内部的接口而失败,因为在那里对此没有元数据。

  @POST
    @Produces({ MediaType.APPLICATION_JSON })
    @Consumes({MediaType.APPLICATION_JSON})
    public String post(MessageObject messageObject) {
</pre><p><b>Root Cause</b></p><pre>javax.json.bind.JsonbException: interface /vendor interface class/ not instantiable
    org.apache.johnzon.jsonb.JohnzonJsonb.fromJson(JohnzonJsonb.java:200)
    org.apache.johnzon.jaxrs.jsonb.jaxrs.JsonbJaxrsProvider.readFrom(JsonbJaxrsProvider.java:182)
...

由于我没有这些类的源代码,因此我在考虑是否可以以其他方式告知反序列化器(如Dependency Injection中的Providers)如何实例化接口。我完全可以控制客户。

我对此不太熟悉,所以我很高兴知道如何解决这个问题,或者这是失败的原因吗?

1 个答案:

答案 0 :(得分:0)

是的,您可以为接口绑定实现,请参见https://johnzon.apache.org/,johnzon.interfaceImplementationMapping部分。可以在可配置提供程序中的resources.xml中设置它。要设置的类为https://github.com/apache/johnzon/blob/master/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java,属性键为interfaceImplementationMapping,其值使用属性语法。

希望有帮助