我想在jax-rs服务中使用拦截器(自定义注释)。
1.首先,我写了一个注释类: BasicAuthentication.java:
@NameBinding
@Target( {ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BasicAuthentication {
}
2.然后我添加了BasicAuthenticationInterceptor实现javax.ws.rs.ext.ReaderInterceptor
BasicAuthenticationInterceptor.java:
@Provider
@Priority(Priorities.AUTHENTICATION)
@BasicAuthentication
public class BasicAuthenticationInterceptor extends Dumpable implements ReaderInterceptor {
@Override
public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
//log.info("authentication here")
String authHeader = context.getHeaders().getFirst(AUTHORIZATION);
if (authHeader == null) {
error("\"authorization\" is not found from the request header.");
throw new WebApplicationException(Response.Status.UNAUTHORIZED);
}
return context.proceed();
}
}
3.最后,我添加了一个带注释@BasicAuthentication的测试服务。
TestRestfulService.java
@Stateless
@Path("/api")
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
@BasicAuthentication
public class TestRestfulService extends Dumpable{
@EJB
LocalService localService;
@Path("/test/{id}")
@GET
public Response test(@PathParam("id")String id) {
try {
localService.findUser(id);
} catch (Exception e) {
error(e);
return Response.serverError().build();
}
return Response.ok().build();
}
}
但每次我用空头请求/ api / test / 1时,我都能得到正确的响应,拦截器似乎根本不起作用。
我正在使用Wildfly 10。 提前谢谢。
答案 0 :(得分:0)
最后我解决了。更改拦截器来过滤:
public class BasicAuthenticationInterceptor implements javax.ws.rs.container.ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext context){
...
}
}
然后按预期工作。
表单JAX-WS API:
消息体读取器拦截器的接口,它包含对MessageBodyReader.readFrom的调用(java.lang.Class,java.lang.reflect.Type,java.lang.annotation.Annotation [],javax.ws.rs.core。 MediaType,javax.ws.rs.core.MultivaluedMap,java.io.InputStream)。
这可能是原因。