验证错误:"找不到适用于类型 java.lang.Integer 的验证器"

92

我正在使用Spring参与一个项目,为什么我一直收到以下错误信息?

javax.validation.UnexpectedTypeException:
No validator could be found for type: java.lang.Integer

这是我的代码:

package com.s2rsolutions.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
@Table(name = "sales")
public class Sales {

    @NotEmpty(message = "The above field must not be blank.")
    @Column(name = "ttl_d_sls_lst_mth", nullable = false)
    private Integer ttl_d_sls_lst_mth;

    @NotEmpty(message = "The above field must not be blank.")
    @Column(name = "ttl_d_sls_6_mth", nullable = false)
    private Integer ttl_d_sls_6_mth;

    @Column(name = "date_added")
    private Date addedDate;

    @Id
    @Column(name = "username")
    private String username;

    // other fields/getters/setters omitted for brevity

}

看起来这跟我之前遇到的很相似,这篇帖子对我有所帮助。可以根据需要自定义绑定时的错误信息。查看此链接,了解如何在应用程序上下文中创建MessageSource bean,并创建一个messages.properties资源包以获取更多详细信息: - Kris
5个回答

231
根据 NotEmpty的javadoc,Integer类型不是它所检查的有效类型。它只适用于字符串和集合。 如果您只想确保整数具有某个值,则javax.validation.constraints.NotNull就足够了。

public @interface NotEmpty

断言注释的字符串、集合、映射或数组不为null或为空。


12
@NotEmpty 作为专有注解,应完全避免使用。可以根据上下文替换为 @NotNull、@Range 和 @Size。 - ChssPly76
3
尽可能避免使用特定供应商的功能,但这归功于自由和开源 :) - Affe
2
真是令人惊讶,不小心在整数字段上注释了一个@NotEmpty注释。然后你会收到一条不太有用的警告:“无法找到约束'javax.validation.constraints.Size'的验证器,验证类型为'java.lang.Integer'。” - Michael Piefel
如果有一种方法可以获得更详细的错误信息,以了解哪个属性导致了异常抛出,那将是非常好的。如果有人知道这个答案,我会非常高兴知道。感谢您的帖子,它解决了我的问题。 - Beezer
@Beezer ConstraintViolationException有一个额外的方法getConstraintViolations(),它返回ConstraintViolation对象列表,每个对象都有一个消息。 - Affe

12

如问题所述,要解决此错误,必须使用正确的注释。在上面的问题中,只能在任何字符串字段上应用@NotBlank@NotEmpty注释。

要验证长整型字段,请使用注释@NotNull


@NotEmpty也可以应用于List或任何其他集合。 - Jose Anibal Rodriguez

12

如果问题是简单地要求在整数字段上使用@Min(1),而不是@size,则可以解决问题。


5

针对此类型错误:UnexpectedTypeException ERROR: 我们试图在任何bean属性上使用不正确的Hibernate验证器注释。 针对我的Springboot项目(验证类型为'java.lang.Integer')出现了同样的问题。

对我有效的解决方案是对Integer使用@NotNull


1
请改善格式并解释为什么您建议这是一个合适的答案。 - Nick Martin

4
您可以添加Hibernate Validator依赖项,以提供一个验证器。
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.12.Final</version>
</dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接