java - JAXRS 包括抽象方法作为请求的候选者

标签 java jakarta-ee jax-rs apache-tomee openejb

在我使用 tomee、openejb 和 jackson 的 web 项目中(除了其他一些东西,如 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
    }
}

我收到此警告:package.ImplementingClass#create 和 package.ImplementingClass#create 都是处理当前请求的同等候选者,这可能导致不可预测的结果

紧随其后的是这个异常:

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 核心:5.2.10.Final
  • javaee-api: 7.0
  • cdi-api: 2.0
  • openejb-核心:7.0.3
  • openejb-cxf-rs: 7.0.3
  • cxf-rt-frontend-jaxrs: 3.1.12
  • 我的:7.0.3
  • asm5-shaded(通过第 3 方引用)
  • 还有大约 20 个...

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

最佳答案

这种情况下的问题是该方法是泛型的,java 编译器生成一个合成方法,因此当 cxf 在您的类上调用 getMethod 时,它会看到两个“创建”方法,一个是合成方法,但无论如何,资源方法将被注册两次。

这是 CXF 中的错误。 CXF-7670

关于java - JAXRS 包括抽象方法作为请求的候选者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45736120/

相关文章:

java - Hibernate 全文搜索分页

json - Jersey Rest Client 是否比 HttpClient 更适合调用 Restful 服务?

java - 如何正确获取 WebTarget 获取请求响应 (JAX-RS) 的正文?

java - 是否可以将 JAX-RS 用作 Web 框架?

java - build() 方法对 JAX-RS 中的响应做什么?

java - 使用 .equals() 和 == 运算符比较两个对象

java - Java 中抽象属性的解决方法

java - 是否有可以表示任意 Javascript 对象的 Java 类?

java - Java JAR 文件是否可能损坏您的系统,您如何检查它在做什么?

java - Eclipse for Java (EE) Developers 和 Eclipse Classic 有什么区别?