【发布时间】:2016-06-21 21:24:04
【问题描述】:
以下是使用 Java 7 JDK 使用 Java EE 6 实现的问题。
情况
我正在尝试实现一个解决方案,其中我有一种 javax.ws.rs.core.Application 类的“核心”或“基础”版本。我有一个核心框架,它是一个单独的 Java 项目,此时它作为 core.jar 存在,其他应用程序可以包含。我想做的是在这个核心框架中有一个类似“CoreApplication”的东西,它扩展了 jax-rs Application 类,看起来像这样:
@ApplicationPath("")
public class CoreApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new HashSet<Class<?>>();
resources.add(ApiListingResource.class);
resources.add(SwaggerSerializers.class);
// Other common resources from the core framework
return resources;
}
@Override
public Set<Object> getSingletons() {
Set<Object> singletons = new HashSet<Object>();
// Register the Jackson provider for JSON
JacksonJaxbJsonProvider jaxbProvider = new JacksonJaxbJsonProvider();
jaxbProvider.setMapper(getUniversalJacksonMapper());
singletons.add(jaxbProvider);
// Other common singletons from the core framework
return singletons;
}
}
问题
如果我将我的 core.jar 包含在它正在使用的应用程序中并尝试执行以下操作:
public class ChildApplication extends CoreApplication {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = super.getClasses();
resources.add(ChildSpecificResource.class);
return resources;
}
...
}
那么这个ChildApplication 类永远不会运行。相反,会运行 CoreApplication 类(假设是因为它实际上扩展了 jax-rs Application 类)并且 ChildApplication 被忽略。
我似乎需要做的是确保 ChildApplication 类直接扩展 Application - 这显然是调用它的唯一方式。因此,如果我这样做,那么我需要一种方法来继承我的子应用程序中的 CoreApplication 类。我想了几种方法来尝试解决这个问题,但都没有奏效。
- 将
CoreApplication保留为一个类,并从ChildApplication继承CoreApplication和Application。这显然行不通,因为 Java 不允许多重继承。 - 将
CoreApplication设为接口。这在某些方面会起作用,但我只能继承ChildApplication中的方法签名,这并没有给我真正想要的代码重用。
我想知道是否有人可以提出解决这个问题的最佳设计。
感谢所有帮助的人!
【问题讨论】:
标签: java web-services inheritance design-patterns jax-rs