当前位置: 首页 > 知识库问答 >
问题:

Spring MVC Hibernate验证器TypeMismatch异常

强安和
2023-03-14

我正在使用Spring MVC和Hibernate Validator4.2.0。在/web-inf/classes/validationmessages.properties中的类路径上有一个validationmessages.properties:

typeMismatch.java.lang.Integer=Must specify an integer value.
typeMismatch.int=Invalid number entered
typeMismatch=Invalid type entered

这是JavaConfig中的一个bean:

@Configuration
@EnableWebMvc
public class WebApplicationConfiguration extends WebMvcConfigurerAdapter {
...

@Bean
public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource resourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
    resourceBundleMessageSource.setBasename("ValidationMessages");
    return resourceBundleMessageSource;
}
...
@Controller
public class myController {
...

@InitBinder("myForm")
protected void initUserBinder(WebDataBinder binder) {
    binder.setValidator(new CustomValidator());
}
...

@ResponseBody
@RequestMapping(value = "/ajax/myRequest", method = RequestMethod.POST)
public CustomResponse ProcessAjaxRequest(
        @Valid @ModelAttribute final MyForm myForm,
        final BindingResult bindingResult)
                throws Exception {

    if (bindingResult.hasErrors()) {
        return new CustomResponse(bindingResult.getAllErrors());
    } else {
        ..
    }
}
...
public class CustomValidator implements Validator {

@Override
public boolean supports(Class c) {
    return MyForm.class.equals(c);
}

@Override
public void validate(Object obj, Errors errors) {
..

使用CustomValidator进行验证工作良好(我手动插入错误消息,而不使用消息源),但是对于绑定typeMismatch错误,我会得到异常

Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Integer' for property 'myField'; nested exception is java.lang.NumberFormatException: For input string: "A"

而不是来自ValidationMessages.properties的代码,因此看起来就像DataBinder(?)没有使用我的消息源。我想要属性文件中的typeMismatch代码,而不是异常消息。我还尝试使用ResourceBundleMessageSource而不是ReloadableResourceBundleMessageSource,但这没有任何区别。有什么想法吗?

共有1个答案

裴弘
2023-03-14

如何得到错误消息?这是为你工作吗?

@Autowired
private MessageSource messageSource;
...

FieldError error = bindingResult.getFieldError("fieldName");
String errorMessage = messageSource.getMessage(error, Locale.getDefault());
 类似资料:
  • 我正在测试带注释的javax验证。它们在应用程序中工作良好,方法参数上有注释。但是当我试图通过手动构建验证工厂来测试它们时 我得到以下错误。 javax。验证。ValidationException:HV000183:无法初始化“javax”。艾尔。“表达工厂”。检查类路径上是否有EL依赖项,或者改用ParameterMessageInterpolator 收到这个错误后,我在gradle文件中添

  • 我正在测试一个具有预期异常的方法。我还需要验证在抛出异常后是否调用了一些清理代码(在模拟对象上),但看起来该验证被忽略了。这是代码。我正在使用 Junit 来验证预期的异常。 似乎完全被忽略了。无论我在中使用什么方法,我的测试都通过了,这不是我想要的。 你知道为什么会发生这种情况吗?

  • 下面是我的代码: 这里有个例外: 对象“users”中字段“salary”上的字段错误:拒绝值[null];代码[NotNull.Users.Salary,NotNull.Salary,NotNull.java.lang.Integer,NotNull];参数[org.springframework.context.support.defaultmessageSourceResolvable:代码

  • 在dynamodb表上运行batchGetItem函数时获取ValidationException。我在密钥列表下同时提供哈希密钥和范围密钥。以下是请求和响应。 请求: 答复:

  • 向addUser控制器提交表单时发生异常 获取窗体的控制器 为什么会出现此异常,输入无效电子邮件而不是验证必须执行。

  • 在测试中,我使用的是mockobject: 我试图验证其方法的使用: 但它抛出以下异常: 组织。莫基托。例外情况。滥用。UnfinishedVerificationException:此处缺少验证(模拟)的方法调用: 这一行的例外点是: setMaxRows接受一个int。 当我注释掉这一行时,测试成功了。调试程序时,我可以看到正在设置的setMaxRows方法: BrandLabels是一个Li