2015-05-04 57 views
1

如果我发送JSON没有请求主体:如何配置DropWizard来解释请求失败?

POST /stuff 
Content-Type: application/json 
Content-Length: 0 
         <---- Body missing! 

...我DropWizard(新泽西州)的资源,

private class PostBody { public String a }; 

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
public Response create(@Valid PostBody body) 
{ … } 

现在,我只得到在日志中的一行:

127.0.0.1 - - [04/May/2015:13:21:25 +0000] "POST /stuff HTTP/1.1" 422 370 232 232 

HTTP 422不是一个不合理的提示,但我必须相信这里会有更详细的信息。同样,如果缺少标题或路径组件与提供的格式不匹配,我希望看到诸如“Header ____ could not be parsed”之类的日志行。

127.0.0.1 - - [04/May/2015:13:21:25 +0000] Received "POST /stuff HTTP/1.1" 
127.0.0.1 - - [04/May/2015:13:21:25 +0000] Error: Body could not be parsed (Failure while deserializing field "a") 
127.0.0.1 - - [04/May/2015:13:21:25 +0000] "POST /stuff HTTP/1.1" 422 370 232 232 

这样的日志内置到DropWizard中吗?我如何启用它?

回答

0

默认情况下,Dropwizard /泽西映射到的异常反应(默认异常映射器),在某些情况下,日志记录是有限的,因此不是非常有用的;因为简单或者仅仅是为了迫使开发者自己做更好的日志记录。作为参考,更完整的描述:

球衣,或者我应该说,JAX-RS,公开的而不是未处理的一种机制,允许你映射抛出的异常或Throwable的一个REST响应,并作为一些堆栈跟踪或错误文本呈现给用户(这种机制要求比实现泛型ExceptionMapper接口,然后注册它。)这对于REST API来说非常好,它可以将错误作为使用API​​的一部分返回给客户端,像返回可以在客户端上解析和处理的异常的JSON表示。“”(source

以编程方式,创建您自己的自定义异常映射程序可以通过以下步骤完成。代码正在考虑Dropwizard 0.9.x,以及您的问题中的具体情况;然而,为了解决其他案例/例外,这个过程是类似的。还有些线路是为了简化省略):通过您的应用程序配置

AbstractServerFactory sf = (AbstractServerFactory) config.getServerFactory(); 
sf.setRegisterDefaultExceptionMappers(false); 
  • :通过您的应用程序子类

      1. 禁用默认异常映射器

        server: 
            registerDefaultExceptionMappers: false 
        
  • 创建,通过增加记录延长原有的自定义异常映射器(JSON和验证例外):

    public class CustomConstraintViolationExceptionMapper extends ConstraintViolationExceptionMapper 
    { 
        @Override 
        public Response toResponse(ConstraintViolationException exception) 
        { 
         Response superResponse = super.toResponse(exception); 
         ValidationErrorMessage validationErrorMessage = (ValidationErrorMessage) superResponse.getEntity(); 
         log.error(String.format("%s\t%s", 
               exception.getMessage(), 
               String.join(";", validationErrorMessage.getErrors()))); 
    
         return superResponse; 
        } 
    } 
    
    public class CustomJsonProcessingExceptionMapper extends JsonProcessingExceptionMapper 
    { 
        @Override 
        public Response toResponse(JsonProcessingException exception) 
        { 
         log.error(String.format("%s", exception.getOriginalMessage())); 
         return super.toResponse(exception); 
        } 
    } 
    
  • 注册您创建自定义的异常映射器:

    environment.jersey().register(new CustomConstraintViolationExceptionMapper()); 
    environment.jersey().register(new CustomJsonProcessingExceptionMapper()); 
    
  • 别忘了t Ø重新添加其他默认异常映射器(如果需要的话 - check Dropwizard's code):

    environment.jersey().register(new LoggingExceptionMapper<Throwable>(){}); 
    environment.jersey().register(new EarlyEofExceptionMapper()); 
    
  • 最终的结果将被记录,如:

    ERROR [2016-07-05 13:06:36,690] x.y.CustomConstraintViolationExceptionMapper: The request entity had the following errors: field may not be empty 
    ERROR [2016-07-05 13:19:41,326] x.y.CustomJsonProcessingExceptionMapper: Unrecognized field "UnknownField" (class x.y.z.Xyz), not marked as ignorable 
    
  • 欲了解更多信息该主题,你也可以按照这些参考: