HttpMessageNotReadableException而不是BeanPropertyBindingResult

问题描述 投票:0回答:1

我有一个带有Double字段的表单。当我添加一个不是Double('foo')的值时,它应该给我一个BeanPropertyBindingResult,该字段有错误。但相反,我得到了HttpMessageNotReadableException

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

这是我的代码(我试着专注于我认为需要更多的东西,我会提供它)。

我有一个Angular前端:

首先是我从Angular得到的错误:

2018-05-22 11:28:59.143 WARN 1262 --- [XNIO-8 task-4] ozpspring.web.advice.AdviceTrait:错误请求:JSON解析错误:无法反序列化java.lang.Double类型的值from String“dddddddd”:不是有效的Double值;嵌套异常是com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“dddddddd”反序列化java.lang.Double类型的值:不是[来源:java.io.PushbackInputStream@36d5105f; line:1,column:1294](通过引用链:nl.tibi.sbys.service.dto.ProjectDTO [“travelRate”])2018-05-22 11:28:59.146 WARN 1262 --- [XNIO-8任务-4] .mmaExceptionHandlerExceptionResolver:由Handler执行引起的已解决异常:org.springframework.http.converter.HttpMessageNotReadableException:JSON解析错误:无法从字符串“dddddddd”反序列化java.lang.Double类型的值:不是有效的Double值;嵌套异常是com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“dddddddd”反序列化java.lang.Double类型的值:不是[来源:java.io.PushbackInputStream@36d5105f; line:1,column:1294](通过引用链:nl.tibi.sbys.service.dto.ProjectDTO [“travelRate”])

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

2018-05-22 11:32:00.516 WARN 18426 --- [main] ozpspring.web.advice.AdviceTrait:错误请求:org.springframework.validation.BeanPropertyBindingResult:1个错误对象'projectDTO'字段'中的字段错误travelRate':拒绝价值[3,5];代码[typeMismatch.projectDTO.travelRate,typeMismatch.travelRate,typeMismatch.java.lang.Double,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:codes [projectDTO.travelRate,travelRate];参数[];默认消息[travelRate]];默认消息[无法将类型'java.lang.String'的属性值转换为属性'travelRate'的必需类型'java.lang.Double';嵌套异常是java.lang.NumberFormatException:对于输入字符串:“3,5”]

我的角度代码发送如下:

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

如何从Angular获得与JUnit测试相同的结果?即如何获得BeanPropertyBindingResult?

我的解决方法是添加ExceptionHandler并解析字符串消息并自己创建BeanPropertyBindingResult

java angular spring-boot
1个回答
0
投票

消息很明确:无法将字符串参数转换为Double属性。

请求正文阅读器在您的bean验证逻辑之前发生,因此不会发生BeanPropertyBindingResult异常。

如果要验证输入是否正确为double,则必须在DTO中将其声明为String并使用自定义验证器对其进行验证:

public class ProjectDTO {
    @Double
    String travelRate;
}

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

© www.soinside.com 2019 - 2024. All rights reserved.