我有一个带有Double字段的表单。当我添加一个不是Double('foo')的值时,它应该给我一个BeanPropertyBindingResult
,该字段有错误。但我得到HttpMessageNotReadableException
。
奇怪的是,从我的JUnit测试中我得到了BeanPropertyBindingResult
这是我的代码(如果需要更多内容,我会尽量专注于我认为需要的代码)。
我有一个Angular前端:
首先是我从Angular得到的错误:
2018-05-22 11:28:59.143 WARN 1262 --- [XNIO-8 task-4] o.z.p.spring.web.advice.AdviceTrait:错误请求:JSON解析 错误:无法从String反序列化java.lang.Double类型的值 “dddddddd”:不是有效的Double值;嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidFormatException:不能 从字符串“dddddddd”反序列化java.lang.Double类型的值:not [来源:有效的双倍价值] 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 task-4] .m.m.a.ExceptionHandlerExceptionResolver:已解决的异常导致 由Handler执行: org.springframework.http.converter.HttpMessageNotReadableException: JSON解析错误:无法反序列化java.lang.Double类型的值 from String“dddddddd”:不是有效的Double值;嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidFormatException:不能 从字符串“dddddddd”反序列化java.lang.Double类型的值:not [来源: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 --- [主要] o.z.p.spring.web.advice.AdviceTrait:错误请求: org.springframework.validation.BeanPropertyBindingResult:1个错误 字段'travelRate'上对象'projectDTO'中的字段错误:被拒绝 价值[3,5];代码 [typeMismatch.projectDTO.travelRate,typeMismatch.travelRate,typeMismatch.java.lang.Double,typeMismatch]; 参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码[projectDTO.travelRate,travelRate];参数[];默认 消息[travelRate]];默认消息[无法转换属性 类型'java.lang.String'的值为必需类型'java.lang.Double' 物业'travelRate';嵌套异常是 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
答案 0 :(得分:0)
消息很明确:无法将字符串参数转换为Double
属性。
请求正文阅读器在您的bean验证逻辑之前发生,因此不会发生BeanPropertyBindingResult
异常。
如果您想验证输入是否正确为double,则必须在DTO中将其声明为String
并使用自定义验证器对其进行验证:
public class ProjectDTO {
@Double
String travelRate;
}
此处@Double
是您的自定义验证程序。这很容易实现。