代码之家  ›  专栏  ›  技术社区  ›  tibi

httpMessageTableException而不是BeanPropertyBindingResult

  •  0
  • tibi  · 技术社区  · 8 年前

    我有一张双字段的表格。当我添加一个不是Double('foo')的值时,它应该给我一个 BeanPropertyBindingResult 对那个字段有错误。但是我却得到了 HttpMessageNotReadableException

    奇怪的是,从我的JUnit测试中我确实得到了 BeanPropertyBindingResult

    这是我的代码(如果需要更多的话,我会提供我认为需要的东西)。

    首先是我从角度得到的误差:

    2018-05-22 11:28:59.143警告1262---[XNIO-8任务-4] o、 z.p.spring.web.advice.advicettrait:错误请求:JSON parse 错误:无法从字符串反序列化java.lang.Double类型的值 com.fasterxml.jackson.databind.exc.InvalidFormatException:无法 在[源: java.io.PushbackInputStream@36d5105f;第1行,第1294列(到 参考链:nl.tibi.sbys.service.dto.ProjectDTO[“旅行费率”]) .m.m.a.ExceptionHandlerExceptionResolver:已解决的异常导致 org.springframework.http.converter.httpMessageTableException:异常 JSON分析错误:无法反序列化java.lang.Double类型的值 来自字符串“dddddd”:不是有效的双精度值;嵌套异常是 从字符串“dddddd”反序列化java.lang.Double类型的值:not 在[Source:java.io.PushbackInputStream@36d5105f; 第1行,第1294列(通过参考链:

    当我从junit测试运行代码时,我得到了这个,这是我认为最好的:

    2018-05-22 11:32:00.516警告18426---[主要] o、 z.p.spring.web.advice.advicettrait:错误请求: org.springframework.validation.BeanPropertyBindingResult:1个错误 字段“travelRate”上的对象“projectDTO”中的字段错误:已拒绝 值[3,5];代码 论据 [org.springframework.context.support.DefaultMessageSourceResolvable:可解析的消息源: 代码[projectDTO.travelRate,travelRate];参数[];默认值 “java.lang.String”类型的值转换为必需的“java.lang.Double”类型 对于属性“travelRate”;嵌套异常为

    我的角度代码发送如下:

    update( project: Project ): Observable<EntityResponseType> {
        const copy = this.convert( project );
        return this.http.put<Project>( this.resourceUrl, copy, { observe: 'response' } )
            .map(( res: EntityResponseType ) => this.convertResponse( res ) );
    }
    

    我的junit测试是:

    restMockMvc.perform(post(url()).param("travelRate", "3,5").param("name", "name")).andExpect(status().isUnprocessableEntity());
    

    我的方法(由于错误的十进制值而未达到):

       @PostMapping()
       @Timed
       public ResponseEntity<ProjectDTO> createProject(@Valid ProjectDTO projectDTO) throws URISyntaxException {
        log.debug("REST request to save Project : {}", projectDTO);
        ....
        } 
    

    我怎样才能得到和JUnit测试相同的结果呢?ie如何获得BeanPropertyBindingResult?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Mạnh Quyết Nguyễn    8 年前

    消息很清楚:无法将字符串参数转换为 Double 财产。

    请求体读取器发生在bean验证逻辑之前,因此 BeanPropertyBindingResult 不发生异常。

    String 在您的DTO中,并使用自定义验证器使其有效:

    public class ProjectDTO {
        @Double
        String travelRate;
    }
    

    在这里 @Double 是您的自定义验证程序。很容易实现。