Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javax.ws.RS.core.Application实现通用JAX-RSWeb服务_Java_Rest_Servlets_Jax Rs_Jersey 2.0 - Fatal编程技术网

使用javax.ws.RS.core.Application实现通用JAX-RSWeb服务

使用javax.ws.RS.core.Application实现通用JAX-RSWeb服务,java,rest,servlets,jax-rs,jersey-2.0,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.RolesAllowedDyna

启用Servlet 3.0的容器允许我们跳过web.xml Servlet配置,并在扩展
javax.ws.rs.core.Application
、使用
@ApplicationPath
对其进行注释后,自动扫描代码中的资源和提供者,并且不重写
getClasses()
方法。(希望我把这些都说对了:\)

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

  • 在我的
    应用程序
    类的
    getClasses()
    方法中注册该类(我认为这将导致Servlet 3.0容器无法自动扫描)
  • 继续将web.xml Jersey servlet设置用于

    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature</param-value>
    </init-param>
    
    
    jersey.config.server.provider.classnames
    org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature
    
  • 现在,这个问题背后的背景是,我可能必须切换到使用RESTeasy,如果我使用选项1,它会在代码中添加Jersey依赖项,并且代码不再是通用的

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

    一个选项是使用(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);
        }
    }
    
    请注意,
    ResourceConfig
    Application

    另请参见:

    注意:

    如果您希望坚持类路径扫描机制,并且希望使项目独立于任何Jersey依赖项,那么还可以覆盖
    应用程序
    类中的
    Map getProperties()
    。在返回的
    映射中
    ,您可以添加其他人在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;
    }
    
    @覆盖
    公共映射getProperties(){
    Map props=newhashmap();
    props.put(“jersey.config.server.provider.classnames”,
    “org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature”);
    返回道具;
    }
    
    但是,即使源代码独立于实现,应用程序仍然依赖于Jersey角色特性。如果您决定要移植,您仍然需要替换该功能


    如果你想保持完全独立,你可以自己实现这个特性。没那么复杂。你可以退房。如果您决定尝试并实现相同的功能,只需使用
    @Provider
    注释您的实现类,它就会被选中。

    谢谢您的精彩回答。在之前的研究之后,我实际上更倾向于自己实现该功能,并检查了
    RolesAllowedDynamicFeature
    的源代码,但不知道这是否是一个好主意。至少我想知道社区是否知道更好的方法。另一个问题是,您是否知道在web.xml中配置特定于实现的servlet(甚至对于3.0容器)有任何问题,并且可能在其中设置包扫描属性?这样,如果我需要切换到另一个impl,我可以更改web.xml配置?Jersey提供了web.xml配置,您可以在其中配置包扫描。不过,Jersey是唯一具有包扫描功能的实现。所以从理论上讲,您可以利用仅针对Jersey的包扫描,并使用其他IMPL,只需对配置进行一些细微的更改,即可恢复到标准行为。我没有厌倦这个,这是我理论上说的。我很确定这并不太难,最棘手的是要考虑什么是最好的配置组合,哪种配置组合对端口造成的痛苦最小。再次感谢您的洞察力。在再次阅读您的问题之后,请注意RESTeasy也有一个使用注释的方法。因此,您可以在应用程序中使用简单的字符串配置(无实现依赖项)来配置这两个选项。看见我不知道将类路径扫描与提供者的web.xml配置相结合的行为……但是您可以测试它。例如,使用
    getProperties()
    (对于Jersey,您可以保留if For RESTeasy也-没有效果),还可以在web.xml的上下文参数中注册RESTeasy角色功能。这对泽西岛应该没有影响。现在这些都是理论上的。我也没有尝试过,但这是另一个可以测试的选项。