javax.servlet.ServletException: HV000030: 找不到适用于类型 java.lang.Integer 的验证器。

33

我需要更新我的数据库中的信息。

FacadePatient.java 类代码:

public Patient update(Patient p) {

    Patient pat = em.find(Patient.class, p.getPatientId());
    p.setPatientPhone(pat.getPatientPhone());
    p.setPatientDateNaiss(pat.getPatientDateNaiss());
    p.setPatientEmail(pat.getPatientEmail());
    p.setPatientJob(pat.getPatientJob());
    p.setPatientSmoking(pat.getPatientSmoking());
    p.setPatientSize(pat.getPatientSize());
    em.merge(pat);
    return p;
}

好的,那么问题是什么?你遇到了验证器异常,还是不知道从哪里开始? - JoshDM
它给出了这个错误:javax.validation.UnexpectedTypeException: HV000030: 找不到适用于类型 java.lang.Integer 的验证器。 - Héla
我还将属性类型从整数更改为字符串,但是仍然出现相同的错误。 - Héla
2
因为这不是JSF或PrimeFaces的问题。如果您通过查看堆栈跟踪(javax.validation.UnexpectedTypeException将出现为根本原因;其包名称javax.validation则暗示了JSR303 bean验证中的问题;而HVxxxxxx错误代码则暗示了Hibernate Validator中的问题)确定了抛出此异常的问题,那么您会将此问题标记为[bean-validation],那么问题就可以更快地理解/回答。到目前为止发布的所有JSF代码都是无关紧要的。 - BalusC
1
此问题也与 javax.servlet.ServletException: HV000030: 找不到类型为 java.util.Date 的验证器 有关。谢谢。 - Rodmar Conde
4个回答

111

HV000030: 找不到 java.lang.Integer 类型的验证器

当您在使用 Hibernate Validator 版本的 JSR303 Bean 验证时,在 JPA 实体中使用了 Hibernate 特定的 @NotEmpty 注解来标注一个 Integer 属性时,就会出现这种情况:

@NotEmpty
private Integer some;

这完全是错误的。整数不可以被视为一个字符串、集合、映射或数组。请改用标准的@NotNull

@NotNull
private Integer some;
请注意,具体问题与 JSF 完全无关。在将来,请学会尽可能排除噪音并通过单独执行 JPA 代码等方式明确具体问题。JSF 只是此处的 HTTP/MVC 信使,PrimeFaces 只是 HTML/CSS/jQuery/UI 代码生成器。

1
我在不同的(但非常愚蠢的)情况下遇到了相同的错误:@Pattern(regexp = "[1-9][0-9]{9}", message = "Phone numbers are 10 digit numbers") private int phoneNumber; --> 仅通过更改为:private String phoneNumber; 得以纠正。 - Mr_and_Mrs_D
使用@Size(max=2)时会出现相同的错误。由于某种原因,Apache MyFaces 2.2在我的JSF应用程序中以警报框的形式显示错误,而Oracle的Mojarra则没有。 - Stephan Rauh
@Stephan:当在ajax请求期间抛出异常时,这种情况会发生(请检查服务器日志!)。Mojarra仅在开发阶段显示该警报。此问题与当前提出的问题无关。另请参见https://dev59.com/wl4c5IYBdhLWcg3wyM0B。 - BalusC

14

我想补充一下上面的答案。当你有类似于这样的东西时,也会抛出此异常:

@Size(min = 1, max = 20)
@Column(name = "ID")
private int id;

我在同样的情况下遇到了这个错误。但是为什么会出现这个错误呢?因为之前它在我的项目中是可以工作的。后来由于@Size,我遇到了这个错误。 - Hema
这也可能是原因。int、boolean、tinyint 上的大小问题会导致此问题。感谢评论。 - Ishimwe Aubain Consolateur

4
你可能在以下情况下遇到此问题:
@Size(max = 45, message = "Field 'SomeEntityClass.yourEnumType' cannot exceed 45 characters") @Column(length=45)
@Enumerated(EnumType.STRING)
private SomeEnumType yourEnumType;

这是因为在验证时,'yourEnumType'(整数类型)的序数值先被处理,而Hibernate在将值存储到数据库之前解析字符串映射。


0

如果存在任何不适用于整数的约束条件,它将抛出错误。例如,使用以下注释对整数进行注释:

  • @Length(max = 3)
  • @Size

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