在构建用于测试旧系统的新编写的客户端的存根测试服务器时,我遇到一种情况,我想将传入的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)如何实例化接口。我完全可以控制客户。
我对此不太熟悉,所以我很高兴知道如何解决这个问题,或者这是失败的原因吗?
答案 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,其值使用属性语法。
希望有帮助