【问题标题】:Creating a reusable "base" class extending javax.ws.rs.core.Application创建扩展 javax.ws.rs.core.Application 的可重用“基”类
【发布时间】: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 类。我想了几种方法来尝试解决这个问题,但都没有奏效。

  1. CoreApplication 保留为一个类,并从ChildApplication 继承CoreApplicationApplication。这显然行不通,因为 Java 不允许多重继承。
  2. CoreApplication 设为接口。这在某些方面会起作用,但我只能继承 ChildApplication 中的方法签名,这并没有给我真正想要的代码重用。

我想知道是否有人可以提出解决这个问题的最佳设计。

感谢所有帮助的人!

【问题讨论】:

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


    【解决方案1】:

    这两个类实际上都扩展了Application,所以这不是问题。问题是@ApplicationPath 注释。带有该注解的类作为主配置类。

    【讨论】:

    • 不错!这很完美,这意味着我最初的设计是可能的。我没有意识到注释控制了主要配置。我还尝试将注释保留在 CoreApplication 类上,并将其添加到同样有效的 ChildApplication 类中。我不确定这是否可取,但显然可以在父母和孩子身上都有@ApplicationPath。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多