如何在Weblogic 12c上将拦截器和过滤器应用于restful服务

时间:2014-03-11 18:11:37

标签: jersey weblogic jax-rs weblogic12c jersey-2.0

我了解 Weblogic 12c v12.2.1 使用 Jersey 作为 JAX-RS 实施。所以我按照this page上的说明操作,但是我无法通过使用名称绑定动态绑定来声明拦截器(即更多信息)提到的链接)

我的应用程序正常运行,因为我实际上可以调用其余的服务,但是我不能应用过滤器或拦截器,它们从不参与过程。

我根本没有编辑 web.xml ,我只有一个javax.ws.rs.core.Application子类

@ApplicationPath("rs")
public class MyApp extends Application {
    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> empty = new HashSet<Class<?>>();

    public MyApp() {
        singletons.add(new MyService());
    }

    @Override
    public Set<Class<?>> getClasses() {
        return empty;
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

MyService类看起来像这样

@Path("")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public class MyService {
    private static final Logger log = Logger.getLogger(MyService.class);

    @GET
    @Path("login")
    public Status login(@QueryParam(USERNAME_PARAM) String username, @QueryParam(PASSWORD_PARAM) String password, @Context HttpServletRequest request) {
        return new Status(ServiceMessages.USER_AUTHENTICATION_SUCCESS);
    }

我有一个空的@Path值,因为我无法排除它,我已经在 MyApp 课程中指定了我的路径而且我不会#39; t指定此类的路径。

我的约束类

import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.FeatureContext;

import com.mycompany.ws.filters.GZIPCompressor;
public class GzipDynamicBinder implements DynamicFeature {

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        context.register(GZIPCompressor.class);
    }

}

我的拦截器类

import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.ReaderInterceptorContext;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;

public class GZIPCompressor implements WriterInterceptor, ReaderInterceptor {

    @Override
    public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
        System.out.println(">>> Compression Reader <<<");
        context.setInputStream(new GZIPInputStream(context.getInputStream()));
        return context.proceed();
    }

    @Override
    public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
        System.out.println(">>> Compressor Writer <<<");
        context.setOutputStream(new GZIPOutputStream(context.getOutputStream()));
        context.proceed();
    }

}

我感谢所有答案,但我真的很喜欢与 web.xml 文件无关的答案。

2 个答案:

答案 0 :(得分:0)

  1. Weblogic JAX-RS 版本 1.1 (我无法在任何地方找到过滤器或拦截器的概念)
  2. Weblogic 泽西版本 1.17 ,我正在引用最新版本的文档,目前 2.6

答案 1 :(得分:0)

我认为你在这里缺少的是GZIPCompressor类中的@Provider注释。添加它应该确保调用拦截器。 查看此博客文章,了解有关应用拦截器的详细步骤 - http://stick2code.blogspot.in/2015/02/performing-gzip-compression-in-jaxrs-20.html