如何将Jersey ExceptionMapper与Google Guice一起使用?

lex*_*ope 9 java jersey guice

我正在使用Jersey Guice,需要配置自定义 ExceptionMapper

我的模块看起来像这样:

public final class MyJerseyModule extends JerseyServletModule
{
   @Override
   protected void configureServlets()
   {
      ...
      filter("/*").through(GuiceContainer.class);
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

这是我的ExceptionMapper:

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;

public class MyExceptionMapper implements ExceptionMapper<MyException>
{
   @Override
   public Response toResponse(final MyException exception)
   {
      return Response.status(Status.NOT_FOUND).entity(exception.getMessage()).build();
   }
}
Run Code Online (Sandbox Code Playgroud)

lex*_*ope 16

您的ExceptionMapper必须使用Monton注释@Provider并成为Singleton.

import com.google.inject.Singleton;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
@Singleton
public class MyExceptionMapper implements ExceptionMapper<MyException>
{
   @Override
   public Response toResponse(final MyException exception)
   {
      return Response.status(Status.NOT_FOUND).entity(exception.getMessage()).build();
   }
}
Run Code Online (Sandbox Code Playgroud)

然后只需绑定ExceptionMapper其中一个Guice模块Injector,你的JerseyServletModule和Zeice Guice会自动找到它.

import com.google.inject.AbstractModule;

public class MyModule extends AbstractModule
{
   @Override
   protected void configure()
   {
      ...
      bind(MyExceptionMapper.class);
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

你也可以直接绑定它,JerseyServletModule如果你想:

public final class MyJerseyModule extends JerseyServletModule
{
   @Override
   protected void configureServlets()
   {
      ...
      filter("/*").through(GuiceContainer.class);
      bind(MyExceptionMapper.class);
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)