JAXRS 包括抽象方法作为请求的候选者
JAXRS includes abstract method as candidate for request
在我使用 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
}
}
我收到此警告: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 [...]
我最好的猜测是注释扫描器不会过滤桥接方法,因此使用了使用抽象 class 的方法(当然)无法实例化。我搜索了如何从扫描器中排除方法(或完成 classes)但没有找到任何东西。
所以我的问题是:我可以从扫描器中排除 classes 或方法吗?如果不能,我还能做些什么来防止这种情况发生?
依赖项(使用 Java 8):
- jackson-jaxrs-json-供应商:2.9.0
- 休眠核心: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
- tomee: 7.0.3
- asm5-shaded(通过第 3 方引用)
- 大约还有 20 个...
所有这些都应该是最新版本。
这种情况下的问题是该方法是泛型的,java编译器生成一个合成方法,所以当cxf在你的class上调用getMethod时,它会看到两个'create' 方法,一个是合成的,但无论如何,该资源方法将被注册两次。
这是 CXF 中的错误。 CXF-7670
在我使用 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
}
}
我收到此警告: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 [...]
我最好的猜测是注释扫描器不会过滤桥接方法,因此使用了使用抽象 class 的方法(当然)无法实例化。我搜索了如何从扫描器中排除方法(或完成 classes)但没有找到任何东西。
所以我的问题是:我可以从扫描器中排除 classes 或方法吗?如果不能,我还能做些什么来防止这种情况发生?
依赖项(使用 Java 8):
- jackson-jaxrs-json-供应商:2.9.0
- 休眠核心: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
- tomee: 7.0.3
- asm5-shaded(通过第 3 方引用)
- 大约还有 20 个...
所有这些都应该是最新版本。
这种情况下的问题是该方法是泛型的,java编译器生成一个合成方法,所以当cxf在你的class上调用getMethod时,它会看到两个'create' 方法,一个是合成的,但无论如何,该资源方法将被注册两次。
这是 CXF 中的错误。 CXF-7670