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

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

我的模块看起来像这样:

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

这是我的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 { @Override public Response toResponse(final MyException exception) { return Response.status(Status.NOT_FOUND).entity(exception.getMessage()).build(); } } 

您的ExceptionMapper必须使用@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 { @Override public Response toResponse(final MyException exception) { return Response.status(Status.NOT_FOUND).entity(exception.getMessage()).build(); } } 

然后将ExceptionMapper绑定到同一个Injector中的一个Guice模块中,其中JerseyServletModule和Jersey Guice会自动找到它。

 import com.google.inject.AbstractModule; public class MyModule extends AbstractModule { @Override protected void configure() { ... bind(MyExceptionMapper.class); ... } } 

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

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