5

我正在使用像 @NotEmpty 这样的 Hibernate 验证器来查看类中的特定属性是否为空。类如图所示:

@Entity
@Table(name="emergency_messages")
public class EmergencyMessages implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id", nullable=false)
private Integer id;

@NotEmpty(message="Home message cannot be empty")
@Column(name="home_page_message")
private String homePageMessage;

@Range(min=0, max=1, message="Please select one of the display announcement value")
@Column(name="messages_enabled")
private Integer messagesEnabled;
}

到目前为止,一切都很好。每当属性“homePageMes​​sage”为空时,我可以在浏览器的表单中看到正确的错误消息。

现在情况发生了变化。新的要求是,只有当其他属性“messagesEnabled”设置为 1 时,属性“homePageMes​​sage”才能为空。如果设置为 0,则不应对“homePageMes​​sage”进行空检查。简而言之,“homePageMes​​sage”的验证现在应该依赖于“messagesEnabled”值。

我的问题:这可能与注释有关吗?如果没有,那么我将不得不拆除我的休眠验证器机制并创建我自己的验证类。

4

3 回答 3

3

我认为您需要编写自定义注释来实现这一点。您也可以使用其他带有自定义注释的休眠验证约束,无需删除任何内容。
检查此链接以获取详细信息。

于 2012-09-11T18:07:58.363 回答
3

以下是我提出的代码(根据 Ajinkya 和 Alex 的建议):

自定义注释:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({ElementType.TYPE})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
@Constraint(validatedBy=HomePageEmptyMessageValidator.class)
public @interface HomePageEmptyMessage {

String message() default "";

 Class<?>[] groups() default {};

 Class<? extends Payload>[] payload() default {};
}

自定义验证器:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class HomePageEmptyMessageValidator implements ConstraintValidator<HomePageEmptyMessage, EmergencyMessages> {

@Override
public void initialize(HomePageEmptyMessage homePageEmptyMessage) {
}

@Override
public boolean isValid(EmergencyMessages emergencyMessages, ConstraintValidatorContext context) {

    if (emergencyMessages == null) {
        return false;
    }

    Integer messageEnabled = emergencyMessages.getMessagesEnabled();
    if (messageEnabled != null) {
        if (messageEnabled == 1) {
            String homePageMessage =  emergencyMessages.getHomePageMessage();
            if (Util.isNullOrEmpty(homePageMessage)) {
                return false;
            } else {
                return true;
            }
        } else {
            return true;
        }
    }

    return false;
}

}

代码中自定义注解的用法:

@Entity
@Table(name="emergency_messages")
@HomePageEmptyMessage(message="Home page annoucement cannot be empty if the Display  Announcement is set to Yes")
public class EmergencyMessages implements Serializable {

private static final long serialVersionUID = -7870767517772161300L; 

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id", nullable=false)
private Integer id; 

@Column(name="home_page_message")
private String homePageMessage;

@Range(min=0, max=1, message="Please select one of the display announcement value")
@Column(name="messages_enabled")
private Integer messagesEnabled;
}

我希望它可以帮助某人。

于 2012-09-13T16:42:51.263 回答
1

您需要的是ConstraintValidator实体的实现,使用其@Constraint上的注释。

您可以在此处对依赖于其他字段的字段设置条件。在字段上使用注释的约束应该用于可以对字段本身进行的检查,而不是依赖于其他约束(如最大大小、可为空等)。

于 2012-09-11T18:11:04.550 回答