我正在使用球衣作为我的休息客户。我想写一个自定义注释,它将拦截请求,以便我可以验证用户并相应地抛出错误。所以我只能注释那些我想要验证的函数。它周围有两个问题。
据我所知,他们在实际调用之前都注入了注释属性。如何在调用此函数时控制。我需要访问@Context HttpServletRequest请求部分以获取userId并进行数据库调用以进行验证..
要注释我的注释解析器的类需要事先知道。我怎样才能使这个独立于此。像春天的注释。
@MYCustomFIlter
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{programId}/processCount")
public Response getProgramInitializedCount(@PathParam("programId") String programId,
@Context HttpServletRequest request) {
//this line will be moved to annotation filter.
String userId = WfManagerUtil.getCurrentUser(request);
有关此问题的任何想法如何实现。
第一次编辑: 通过一些研究,我发现了如何做到这一点。但这不会发生。有人可以帮我找出原因。
注释:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateUser {
}
过滤器:
public class ValidateUserFilter implements ContainerRequestFilter {
@Override
public ContainerRequest filter(ContainerRequest request) throws WebApplicationException{
String user = request.getHeaderValue(USER_HEADER);
//rest of code.
}
}
绑定:
@Provider
public class ResourceFilterBindingFeature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
if (resourceInfo.getResourceMethod().isAnnotationPresent(ValidateUser.class)) {
context.register(CommonResourceFilter.class);
}
}
}
并将其用作:
@Path("/v1.0/programs")
public class ProgramsResource {
@ValidateUser
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{programId}/initialization/progress/")
public Response getProgramInitializedCount(@PathParam("programId") String programId,
@Context HttpServletRequest request) throws WorkflowManagerException {
//code
}
}
POM:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.8</version>
<!-- <scope>provided</scope> -->
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.8</version>
<!-- <scope>provided</scope> -->
</dependency>
我可能在哪里做错了。没有调用过滤器类。