有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Google Guice中使用Jersey ExceptionMapper?

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

共 (1) 个答案

  1. # 1 楼答案

    您的ExceptionMapper必须用@Provider注释,并且是单例

    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();
       }
    }
    

    然后只需将ExceptionMapper绑定到与JerseyServletModule相同的Injector中的一个Guice模块中,Jersey Guice就会自动找到它

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

    如果您想:

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