JAXRS包含抽象方法作为请求的候选者

时间:2017-08-17 13:14:44

标签: java java-ee jax-rs tomee openejb

在我的webproject中使用tomee,openejb和jackson(在hibernate之类的其他一些东西中,下面列出了最重要的依赖项)我遇到了一个我无法解决的问题。

具有如下结构:

public abstract class AbstractCrud<E extends AbstractEntity>{
 [...]
   public abstract ResultWrapper<E> create (E entity);
 [...]
}

@Path("/path")
@Consumes("application/json")
@Produces("application/json")
public class ImplementingClass extends AbstractCrud<ImplementingEntity>{
    @PUT
    @Override
    public ResultWrapper<ImplementingEntity> create(final ImplementingEntity entity){
      //Some Code
    }
}

我收到此警告:Both package.ImplementingClass#create and package.ImplementingClass#create are equal candidates for handling the current request which can lead to unpredictable results

接下来是这个例外:

Cannot construct instance of `package.AbstractEntity` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [...]


我最好的猜测是注释扫描器不会过滤桥接方法,因此使用抽象类的方法(当然)不能实例化。我已经搜索了如何从扫描仪(或完整的类)中排除方法,但没有发现任何东西。
所以我的问题是:我可以从扫描仪中排除类或方法,如果没有,我还能做些什么来防止这种情况发生?


依赖关系(使用Java 8):

  • jackson-jaxrs-json-provider:2.9.0
  • hibernate-core:5.2.10.Final
  • javaee-api:7.0
  • cdi-api:2.0
  • openejb-core:7.0.3
  • openejb-cxf-rs:7.0.3
  • cxf-rt-frontend-jaxrs:3.1.12
  • tomee:7.0.3
  • asm5-shaded(通过第三方引用)
  • 大约20多个......

所有这些应该是最新版本。

1 个答案:

答案 0 :(得分:1)

在这种情况下的问题是该方法是通用的,java编译器生成一个合成方法,所以当cxf在你的类上调用getMethod时,它会看到两个'create'方法,一个是合成的,但无论如何,资源方法将被注册两次。

这是CXF中的一个错误。 CXF-7670