标签: jax-rs

带有 JAX-RS 2 和 Tomcat 9 的 RESTful Java

我正在使用 JAX-RS 2 测试 RESTful 服务。下面是我的项目和我的类。

在此处输入图片说明

@ApplicationPath("/test/*")
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> clazz = new HashSet<>();
        clazz.add(UserResource.class);
        System.out.println("getClass");
        return clazz;
    }
Run Code Online (Sandbox Code Playgroud)

资源类如:

@ApplicationPath("/test/*")
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> clazz = new HashSet<>();
        clazz.add(UserResource.class);
        System.out.println("getClass");
        return clazz;
    }
Run Code Online (Sandbox Code Playgroud)

当我使用 测试服务时http://localhost:8082/dt/test/user,出现 404 错误。

java rest jax-rs http-status-code-404

4
推荐指数
1
解决办法
4685
查看次数

JAX-RS (Jersey 2) 安全性、@PermitAll 和 @RolesAllowed 未按预期工作

我有一个包含三个资源的 REST-API。第一个中的方法称为 PublicResource,任何人都应该可以访问(即匿名访问)。第二个方法中的方法称为 SecretResource,应该只能由特定的用户组访问。最后,称为 MixedResource 的第三个资源具有混合设置,其中一些方法受到保护,一些方法对公共访问开放。

注释@PermitAll 和@RolesAllowed 并不像我期望的那样工作。尽管 PublicResource 用 @PermitAll 进行了注释,但我在尝试访问它时仍然会被要求授权。MixedResource 中用@PermitAll 注释的方法也是如此。所以基本上,我的所有资源都被要求授权,即使我应该匿名访问。

我在 Payara 4.1 上运行,我很困惑,因为我在另一个运行在 WebLogic 12.1.3 上的应用程序中进行了非常相似的设置,并且注释按预期工作。我错过了什么或弄错了什么?在下面查看我的完整代码。

公共资源.java:

    import javax.annotation.security.PermitAll;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;

    @Path("public")
    @PermitAll
    public class PublicResource {

        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String itsPublic() {
            return "public";
        }

    }
Run Code Online (Sandbox Code Playgroud)

秘密资源.java:

    import javax.annotation.security.RolesAllowed;
    import javax.ws.rs.GET;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;

    @Path("secret")
    @RolesAllowed({ "SECRET" })
    public class SecretResource {

        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String itsSecret() {
            return "secret";
        }

    }
Run Code Online (Sandbox Code Playgroud)

混合资源.java:

    import …
Run Code Online (Sandbox Code Playgroud)

java security rest jax-rs jersey

4
推荐指数
1
解决办法
8417
查看次数

ContainerRequestContext abortWith() 不会中止

这是我的身份验证过滤器:

@Secured
@Provider
@Priority(Priorities.AUTHENTICATION)
public class SecuredFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) {

        String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
        if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
             requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
        }

        String token = authorizationHeader.substring("Bearer".length()).trim();
        // [...]
        }
}
Run Code Online (Sandbox Code Playgroud)

为什么在缺少标头时它不会中止并发回响应? 现在我在 authorizationHeader.substring 得到一个明显的 NPE ...

文件说:

void abortWith(响应响应)

使用响应中止过滤器链。此方法中断过滤器链处理并将提供的响应返回给客户端。提供的响应通过适用的响应过滤器链。参数: response - 要发送回客户端的响应。

我错过了什么?

rest jax-rs jakarta-ee

4
推荐指数
1
解决办法
2442
查看次数

使用 ResourceInfo 和 mockito 的单元测试 ContainerRequestFilter

我正在尝试使用 Mockito 对使用 @NameBinding 应用的 ContainerRequestFilter 进行单元测试。过滤器检查注释字段以确定要执行的操作。查看示例代码:

注解

@Target({TYPE, METHOD})
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    MyEnum info() default MyEnum.DEFAULT;
}
Run Code Online (Sandbox Code Playgroud)

我的枚举

public enum MyEnum {
    VALUE1,
    VALUE2,
    DEFAULT
}
Run Code Online (Sandbox Code Playgroud)

使用 MyEnum 作为条件的带注释的过滤器

@MyAnnotation
public class MyFilter implements ContainerRequestFilter {

    @Context
    private ResourceInfo resourceInfo;

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException {

        if (resourceInfo.getResourceMethod().getAnnotation(MyAnnotation.class).info().equals(MyEnum.VALUE1)) 
        {
            // set some value or throw some exception (this can be verified in the test)
        }

        if (resourceInfo.getResourceMethod().getAnnotation(MyAnnotation.class).info().equals(MyEnum.VALUE2))
        {
           // set some value or throw …
Run Code Online (Sandbox Code Playgroud)

java unit-testing jax-rs jersey mockito

4
推荐指数
1
解决办法
4326
查看次数

JAX-RS 中的 @DefaultValue 日期:now() 和 MAX

我有一个查询参数如下:

@GET
public Response myFunction(@QueryParam("start") final LocalDate start, @QueryParam("end") final LocalDate end) { ... }
Run Code Online (Sandbox Code Playgroud)

为此,我创建了一个ParamConverter<LocalDate>将字符串转换为日期,反之亦然。

现在我想使用@DefaultValue注解来声明一个默认值。我有两个特殊的默认值:

  • 今天(对于start
  • 最大值/无穷大(对于end

是否可以为此使用@DefaultValue注释?如何?

java jax-rs jersey jersey-2.0 java-time

4
推荐指数
1
解决办法
1322
查看次数

ClientBuilder newBuilder() 与 newClient()

关于javax.ws.rs.client.ClientBuilder,我已经阅读了JavaDocJersey 文档,但是我仍然不清楚何时应该使用newClient()以及何时应该使用newBuilder()

我确实注意到newClient()允许我们传入 a ClientConfig,并newBuilder()允许我们设置sslContext(). 如果我们需要两者都做怎么办?

谁能给我一个关于这两个概念的快速总结?

java jax-rs jersey

4
推荐指数
1
解决办法
1482
查看次数

在 WebLogic 12c / Jersey 上禁用 JAX-RS 资源的自动注册

WebLogic 12c 包含一个默认 JAX-RS 资源 ( https://docs.oracle.com/cd/E24329_01/web.1211/e24983/configure.htm#RESTF191 ),该资源将使用 JAX-RS 批注注解的所有类注册为资源。

我使用 Jersey 代理客户端(http://blog.alutam.com/2012/05/04/proxy-client-on-top-of-jax-rs-2-0-client-api/),所以我的界面类具有所有 JAX-RS 注释并打包在它们自己的“API”jar 中。然后将 API jar 部署到基本上两个不同的上下文:服务和客户端。该服务提供 API 的实现,它是实际的业务逻辑,并作为 JAX-RS Web 服务公开。客户端只是服务的消费者,API jar 中服务接口的实现是 Jersey 代理客户端。

不幸的是,WebLogic 12c 在这里给我带来了两个问题:

1) 它会自动注册我的 API jar 中的所有资源,并将它们作为来自客户端应用程序的 Web 服务公开(实现是(现在实际上是)代理客户端)!这是非常意外的。

2) 有时我想使用 API 中的类而不实际使用服务,所以我什至不提供接口的实现。这应该没问题,但是因为 WebLogic 尝试自动加载 API 资源,但没有找到带注释的接口的实现,所以它拒绝部署战争。

我可以在 web.xml 中使用安全策略或奇怪的 jax-rs 配置解决问题 1,但这并不能解决问题 2。最好的解决方案是关闭 WebLogic 中的默认资源,但我找不到这样做的任何文件。

有没有办法关闭WebLogic中的默认资源或关闭自动Jersey扫描?

weblogic jax-rs jersey jersey-client

4
推荐指数
1
解决办法
2283
查看次数

JAX-RS:无状态、单例、RequestScoped 混淆

我已经多次看到 JAXRS 资源的几种配置方式。

我的意思是,有时我看到它们被注释为@Singleton, @Stateless, @ApplicationScoped, @RequestScoped, 甚至没有任何注释或同时使用它们。

  • javax.enterprise.context.RequestScoped
  • javax.enterprise.context.ApplicationScoped
  • javax.ejb.Stateless
  • javax.ejb.Singleton
  • javax.inject.Singleton

我应该使用哪个注释?

有什么javax.ejb用JAXRS资源呢?

另一方面,我也想知道如何准确地使用@Context注释。

我的意思是,我已经看到这应用于参数,也在类字段中

@Path("entity")
public class EntityResource {

    @Context
    private Request request;

    @POST
    public Response create(Entity entity) {
        this.request...
    }

}
Run Code Online (Sandbox Code Playgroud)

或者,

@Path("entity")
public class EntityResource {

    @POST
    public Response create(Entity entity, @Context Request request) {
        request...
    }

}
Run Code Online (Sandbox Code Playgroud)

我将如何进行?

java jax-rs cdi

4
推荐指数
1
解决办法
2541
查看次数

基本身份验证请求应该是 POST 还是 GET?

我已经看到在GETPOST请求中都完成了基本身份验证。

一方面,我认为浏览器缓存GET请求可能是一个问题,但另一方面:POST更大但鼓励提供敏感信息。

我不是在问GETPOST请求之间的区别,而是应该将哪一个用于基本身份验证。应该GET只与 HTTPS 一起使用吗?应该POST一直使用吗?

我的问题是应该使用哪一个?哪个是更好的做法?

java rest restful-authentication jax-rs basic-authentication

4
推荐指数
2
解决办法
4958
查看次数

java中Restful端点上基于角色的身份验证

我正在尝试实现某种基于角色的身份验证。我正在使用 JWT 令牌。我一直在看指南,但他们都提到了“Spring boot”的使用。我将如何在 Java 的 Restful 端点上设置基于角色的身份验证?最好通过某种过滤器。

我正在寻找一种方法来简单地添加:@Role(Role.ADMIN)在端点之前。

我已经设置了以下课程:

java restful-authentication jax-rs jwt jakarta-ee

4
推荐指数
1
解决办法
1830
查看次数