![](/img/trans.png)
[英]Using Hibernate Validator Annotation Processor with Kotlin (and Gradle)
[英]Hibernate Validator : Using if - else kind of logic in annotation
我正在使用像@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;
}
到现在为止还挺好。 每当属性“homePageMessage”为空时,我都可以在浏览器中看到表单中的正确错误消息。
现在情况发生了变化。 新要求是,只有当其他属性“messagesEnabled”设置为1时,属性“homePageMessage”才可以为空。如果设置为0,则“homePageMessage”不应进行空检查。 简单来说,“homePageMessage”的验证现在应该依赖于“messagesEnabled”值。
我的问题:这可能与注释有关吗? 如果没有,那么我将不得不拆除我的hibernate验证器机制并创建我自己的验证类。
我认为你需要编写自定义注释来实现这一目标。 您还可以使用其他hibernate验证约束和自定义注释,无需删除任何内容。
请查看此链接了解详情。
以下是我提出的代码(在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;
}
我希望它对某人有帮助。
您需要的是实体的ConstraintValidator
实现,使用@Constraint
注释。
这是您将条件放在依赖于其他字段的字段上的位置。 使用字段上的注释的约束应该用于可以在字段本身上进行的检查,而不是依赖于另一个(例如max size,nullable等...)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.