2017-02-15 59 views
1

我想使用单个ExceptionHandler处理每个异常,同时使用ratpack实现REST API。这个ExceptionHandler将处理每个运行时异常并相应地发送json响应。Ratpack Rest API ExceptionHandler

在ratpack中可能吗?在Spring中,我们使用@ControllerAdvice注解来实现这一点。我想用ratpack实现类似的行为。

感谢您的帮助。

回答

2

好,最简单的方法是定义你的类实现谁ratpack.error.ServerErrorHandler,并在注册表中绑定到ServerErrorHandler.class

这里是与吉斯注册表ratpack应用的例子:

public class Api { 
    public static void main(String... args) throws Exception { 
    RatpackServer.start(serverSpec -> serverSpec 
     .serverConfig(serverConfigBuilder -> serverConfigBuilder 
     .env() 
     .build() 
    ) 
     .registry(
     Guice.registry(bindingsSpec -> bindingsSpec 
      .bind(ServerErrorHandler.class, ErrorHandler.class) 
     ) 
    ) 
     .handlers(chain -> chain 
     .all(ratpack.handling.RequestLogger.ncsa()) 
     .all(Context::notFound) 
    ) 
    ); 
    } 
} 

而且类似的ErrorHandler:

class ErrorHandler implements ServerErrorHandler { 

    @Override public void error(Context context, Throwable throwable) throws Exception { 
    try { 
     Map<String, String> errors = new HashMap<>(); 

     errors.put("error", throwable.getClass().getCanonicalName()); 
     errors.put("message", throwable.getMessage()); 

     Gson gson = new GsonBuilder().serializeNulls().create(); 

     context.getResponse().status(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()).send(gson.toJson(errors)); 
     throw throwable; 
    } catch (Throwable throwable1) { 
     throwable1.printStackTrace(); 
    } 
    } 

}