如何在Jersey / Jackson中为抽象方法参数指定具体类型?

时间:2015-06-12 17:28:49

标签: java jersey jackson jax-rs

我正在使用Jersey并暴露了一个实现Resource的资源InterfaceInterface中的一种方法具有a类型的参数A,它是一个抽象类。

以下是一些解释代码:

//Interface.java
public interface Interface {
    public void setA(A a);
}
//Resource.java
@Path("/hello")
public class Resource implements Interface {
    @POST
    public void setA(A a){ //Here I want to specify AImpl instead of A
        //Code that uses AImpl
    }
}
//A.java
public abstract class A{
    //Some abstract stuff
}
//AImpl.java
public class AImpl extends A{
    //Some concrete stuff
}

这会导致错误:

JsonMappingException: Can not construct instance of A, problem: abstract types can only be instantiated with additional type information

如何避免/克服这种情况?

一个解决方案是让Jersey / Jackson意识到它可以在A的方法AImpl中使用setA()Resource)的具体实现。我可以使用任何注释来做到这一点吗?

1 个答案:

答案 0 :(得分:1)

您是否考虑过只使Interface通用?像

这样的东西
public abstract class SuperType {}

public class SubType extends SuperType {}

public interface Resource<T extends SuperType> {
    Response doSomething(T type);
}

@Path("resource")
public class SubTypeResource implements Resource<SubType> {
    @POST
    @Override
    public Response doSomething(SubType type) {
        ...
    } 
}