Jersey kaynakları üzerinde ek açıklamalar ile etkileşim iki dersleri sunmaktadır: Uygulama başladığında bir kez tetiklenmesinasıl kaynak açıklamaları alabileceğiniz bir Jersey ContainerResponseFilter
- ResourceFilterFactory, bir sınıf olarak devralabilir onları devralabilir
- ContainerRequestFilter, ContainerResponseFilter birkaç sınıflar her istek/yanıt üzerine tetiklenmesini
ResourceFilterFacto ry, yöntem ve sınıf ek açıklamalarına erişim sağlayan bir AbstractMethod
alan bir create
yöntemini (uygulamak için) tanımlar.
ContainerRequestFilter ve ContainerResponseFilter tanımlayan bir filter
yöntem istek/tepkiyi almak ancak bu denilen yöntem açıklama münhasıran erişimi değil, sınıf birini veririz ki (uygulamak).
HTTP önbellek başlıklarını aşağıdaki şekilde tanımlayan bir CacheControl ek açıklaması yapmaya çalışıyorum.
@Path("/path")
@CacheControl(maxAge = 172800)
public class Resource
{
@GET
@Path("/{id}")
@CacheControl(mustRevalidate = true)
public Response get(@PathParam("id") Long id)
{
...
}
}
Benim sorunum
benim uygulamada tanımlanan her DİNLENME yöntemi için yeni bir CacheControlFilter oluşturmak istediğiniz kalmamasıdır.public class FilterFactory implements ResourceFilterFactory
{
@Override
public List<ResourceFilter> create(AbstractMethod method)
{
List<ResourceFilter> filters = newArrayList();
if (isAnnotationPresent(method, CacheControl.class))
filters.add(new CacheControlFilter(method));
return filters;
}
private boolean isAnnotationPresent(AbstractMethod method, Class<? extends Annotation> clazz)
{
return method.isAnnotationPresent(clazz) || method.getResource().isAnnotationPresent(clazz);
}
}
her DİNLENME yöntemi için bir CacheContronlFilter örneklilik olmadan AbstractMethod
erişmek için bir yolu var mı?
public class CacheControlFilter implements ResourceFilter, ContainerResponseFilter
{
private AbstractMethod method;
public CacheControlFilter(AbstractMethod method)
{
this.method = method;
}
@Override
public ContainerResponse filter(ContainerRequest request, ContainerResponse response)
{
putCacheControlIfExists(response, method.getAnnotations());
putCacheControlIfExists(response, method.getResource().getAnnotations());
return response;
}
private void putCacheControlIfExists(ContainerResponse response, Annotation[] annotations)
{
CacheControl annotation = findCacheControl(annotations);
if (annotation != null)
response.getHttpHeaders().put(CACHE_CONTROL, createCacheControlHeader(annotation));
}
private CacheControl findCacheControl(Annotation[] annotations)
{
for (Annotation annotation : annotations)
if (annotation instanceof CacheControl)
return (CacheControl) annotation;
return null;
}
private List<Object> createCacheControlHeader(CacheControl annotation)
{
javax.ws.rs.core.CacheControl header = new javax.ws.rs.core.CacheControl();
header.setMaxAge(annotation.maxAge());
header.setMustRevalidate(annotation.mustRevalidate());
header.setNoCache(annotation.noCache());
header.setNoStore(annotation.noStore());
header.setNoTransform(annotation.noTransform());
header.setProxyRevalidate(annotation.proxyRevalidate());
return Lists.<Object> newArrayList(Splitter.on(',').split(header.toString()));
}
@Override
public ContainerRequestFilter getRequestFilter()
{
return null;
}
@Override
public ContainerResponseFilter getResponseFilter()
{
return this;
}
}
Paylaşım örnekleri, gereken parçadır;) –