是否可以对球衣REST方法施加约束?

时间:2013-10-10 13:49:55

标签: java rest jaxb jersey

我想检查一下我们是否“关闭”了某个特定端点。目前,它是通过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;
    }
}

我想让每个rest方法执行约束,但约束不会触发。

@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) {
....

Everything编译和部署很好,但是在调用端点时都没有调用init或isValid方法。我在我的应用程序中的POJO上设置了其他方法级别约束,并且在调用方法时它们会自动触发。我正在尝试做什么?如果是这样,我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

在Jersey 1.x中,您可以使用基于绑定过滤器(ContainerRequestFilter / ContainerResponseFilter)的ResourceFilterFactory / ResourceFilter概念到特定资源方法(即{ {1}}来自你的例子)。此类工厂的示例可以是RolesAllowedResourceFilterFactory,它会根据安全注释的存在(即包getPeople中的@RolesAllowed)向资源方法添加请求过滤器。