2012-08-16 5 views
7

私はニュージャージーのGuiceを使用して、カスタムにExceptionMapperGoogle GuiceでJersey 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(); 
    } 
} 

答えて

14

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

は、それからちょうどあなたの JerseyServletModule同じ InjectorにGuiceのモジュールの一つで ExceptionMapperを結合し、そしてジャージーのGuiceは自動的にそれを見つけるでしょう。

あなたがしたい場合は、直接 JerseyServletModuleでそれをバインドすることができ
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); 
     ... 
    } 
} 
関連する問題