在我使用 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/