java - 使用 javax.ws.rs.core.Application 实现通用 JAX-RS Web 服务

标签 java rest servlets jax-rs jersey-2.0

启用 Servlet 3.0 的容器允许我们跳过 web.xml servlet 配置,并在您扩展 javax.ws.rs.core.Application 后自动扫描您的代码以获取资源和提供程序,并使用注释@ApplicationPath 并且不要覆盖 getClasses() 方法。 (希望我做对了:\)

目前我正在使用 Jersey 实现并使用 @RolesAllowed 注释保护资源方法。为此,我需要注册 org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature Provider 类,但是,我知道的唯一方法是:

  1. 在我的 Application 类的 getClasses() 方法中注册该类(我认为这会导致 Servlet 3.0 容器不自动扫描)<
  2. 继续使用 web.xml Jersey servlet setup

    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature</param-value>
    </init-param>
    

现在这个问题背后的背景是,我可能不得不切换到使用 RESTeasy,如果我使用选项 1,它会在代码中添加一个 Jersey 依赖项,并且代码不再是通用的。

如何编写代码以使用安全注释,同时维护可以部署到另一个 Servlet 3.0 JAX-RS 实现的通用 JAX-RS 代码?

最佳答案

一个选择是使用 javax.ws.rs.core.Feature (一个 JAX-RS 标准类)。您可以在那里注册任何组件,然后用 @Provider 注释该类, 它会像其他任何东西一样被拾起 @Provider@Path注释类

@Provider
public class MyFeature implements Feature {
    @Overrride
    public boolean configure(FeatureContext context) {
        context.register(RolesAllowedDynamicFeature.class);
    }
}

请注意,由于您正在使用 Jersey 功能,您的应用程序不再独立于实现,因此您不妨一直使用 Jersey。首先,Jersey 不建议扫描类路径,这是你正在做的事情的影响。相反,Jersey 有一种机制允许您递归扫描包(及其子包)。所以你可以改为做

@ApplicationPath("..")
public class AppConfig extends ResourceConfig {
    public AppConfig() {
        packages("the.packages.to.scan");
        register(RolesAllowedDynamicFeature.class);
    }
}

请注意 ResourceConfigApplication 的子类

另请参阅:

注意:

如果你想坚持使用类路径扫描机制,并且想让项目独立于任何 Jersey 依赖项,你也可以覆盖 Map<String, Object> getProperties()Application类(class)。在返回Map ,您可以添加您本来会在 web.xml 中添加的属性

@Override
public Map<String, Object> getProperties() {
    Map<String, Object> props = new HashMap<>();
    props.put("jersey.config.server.provider.classnames",
              "org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature");
    return props;
}

但是即使源代码是独立于实现的,应用程序仍然依赖于 Jersey 角色功能。如果您决定要移植,您仍然需要替换该功能。

如果您想保持完全独立,您可以自己实现该功能。并没有那么复杂。你可以看看the source code for RolesAllowedDynamicFeature .如果您决定尝试实现相同的功能,只需使用 @Provider 注释您的实现类即可。 , 它应该被拾起。

关于java - 使用 javax.ws.rs.core.Application 实现通用 JAX-RS Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663193/

相关文章:

java - 将文件从 Javascript 传递到 Java Uploader Applet

java - 我的数据库 servlet 中的连接出错

java - 如何将字符串转换为字节数组?

java - 需要帮助理解 org.bouncycaSTLe.asn1.ASN1InputStream "java.io.IOException: DER length more than 4 bytes: 63"

java - 本地tomcat服务器返回405 Method Not allowed

rest - 多语言 REST 资源 - URL 命名建议

java - Java EE 应用程序的理想错误页面

javascript - 处理验证邮件

java - 如何在不使用 if 的情况下编写 Fibonacci Java 程序

wcf - VS 2010 中缺少 HttpClient 和 HttpResponseMessage - 用于使用 REST 服务