创建一个可重用的“base”类,扩展javax.ws.rs.core.Application

时间:2016-06-21 21:24:04

标签: java web-services inheritance design-patterns jax-rs

以下是使用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类。我想到了几种方法来尝试解决这个问题,但都没有工作。

  1. CoreApplication作为一个班级,并从CoreApplication继承ApplicationChildApplication。这显然是行不通的,因为Java不允许多重继承。
  2. 使CoreApplication成为一个界面。这可以在某些方面起作用,但后来我只能继承ChildApplication中的方法签名,这不会给我真正的代码重用。
  3. 我想知道是否有人可以提出最佳设计来解决这个问题。

    感谢所有帮助的人!

1 个答案:

答案 0 :(得分:1)

这两个类实际上都扩展了Application,所以这不是问题。问题是@ApplicationPath注释。具有此批注的类用作主要配置类。