1

我想检查一下我们是否“关闭”了一个特定的端点。目前它是通过 ContainerRequestFilter 实现的。但是由于我不能直接挂接到控制器/资源级别的过滤器(据我所知),所以我能做的最好的事情就是从过滤器中抛出一个异常,然后返回给客户端,我宁愿客户端查看格式化的 json 错误响应而不是堆栈跟踪。

我实现了以下约束接口和类:

@NotNull
@Target({METHOD, FIELD, ANNOTATION_TYPE, PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = MethodNotImplementedImpl.class)
@Documented
public @interface MethodNotImplemented {
    String message() default "{Default message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

public class MethodNotImplementedImpl implements ConstraintValidator<MethodNotImplemented, UriInfo>  {
    public void initialize(MethodNotImplemented constraintAnnotation) {logger.debug("init called");}
    public boolean isValid(UriInfo uriInfo, ConstraintValidatorContext constraintContext) {
        logger.debug("validate called");
        return true;
    }
}

我想让每个休息方法然后执行约束,但约束没有触发。

@Validated
@Path("/people")
public class PeopleController extends BaseController {
@GET
@Path("/{peopleId}")
@Produces(MediaType.APPLICATION_JSON)
public Response getPeople(@MethodNotImplemented @Context UriInfo uriInfo,
                          @PathParam("peopleId") String peopleId,
                          @DefaultValue("") @QueryParam("fields") String partialResponseFields) {
....

一切都可以正常编译和部署,但是在调用端点时不会调用 init 或 isValid 方法。我在我的应用程序中的 POJO 上设置了其他方法级别约束,并且在调用该方法时它们会自动触发。我正在尝试做的事情可能吗?如果是这样,我做错了什么?

4

1 回答 1

0

在 Jersey 1.x(JAX-RS 1.1 的 RI)中,不支持 Bean Validation,因此您的示例不起作用。Bean Validation 支持随 JAX-RS 2.0 一起提供,并且在 Jersey 2.x 中几乎是开箱即用的(您需要将jersey-bean-validation模块添加到您的类路径中,然后才能使用它)。您可以查看文档(Bean Validation Support)和其中一个示例(bean-validation-webapp)。

在 Jersey 1.x 中,您可以使用ResourceFilterFactory / ResourceFilter的概念,它们基于将过滤器(ContainerRequestFilter/ ContainerResponseFilter)绑定到特定资源方法(即getPeople来自您的示例)。这种工厂的一个例子可以是RolesAllowedResourceFilterFactory,它根据安全注释的存在(即@RolesAllowed来自 package javax.annotation.security)将请求过滤器添加到资源方法。

于 2013-10-15T19:40:16.780 回答