@Positive 注解仍然取负值
@Positive Annotation still taking negative value
我的@Positive 注释仍然取负值。
验证字段的代码是
@Basic(optional = false)
@NotNull
@Positive(message = "value must be positive and 2 digits")
@Digits(integer=2, fraction=0, message = "value must be positive and 2 digits whole number")
@Column(name = "add_user")
private int addUser;
我使用的导入是
import javax.validation.constraints.Positive;
我使用的依赖项是
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.9.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.2.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>6.1.2.Final</version>
</dependency>
显示错误的表单域是
<tr>
<td><form:label path="addUser">Add User</form:label></td>
<td><form:input path="addUser"/></td>
<td style="color:red"> <form:errors path="addUser"/> </td>
</tr>
控制器方法是
@PostMapping("/addBrewery")
public ModelAndView addAnBrewery(ModelMap model, @Valid @ModelAttribute("brewerie") Breweries brewerie, BindingResult result) {
if (result.hasErrors()) {
System.out.println(result);
return new ModelAndView("/addBrewery");
}
service.addAnBreweries(brewerie);
return new ModelAndView("redirect:/breweries");
}
Breweries 对象 class 是一个 JPA
Breweries.java 的代码如下,由于此问题中的代码量和文本不足,我必须删除 getter 和 setter
@Entity
@Table(name = "breweries")
@SecondaryTable(name = "breweries_geocode", pkJoinColumns = @PrimaryKeyJoinColumn(name = "brewery_id", referencedColumnName = "id"))
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Breweries.findAll", query = "SELECT b FROM Breweries b"),
@NamedQuery(name = "Breweries.findById", query = "SELECT b FROM Breweries b WHERE b.id = :id"),
@NamedQuery(name = "Breweries.findByName", query = "SELECT b FROM Breweries b WHERE b.name = :name"),
@NamedQuery(name = "Breweries.findByAddress1", query = "SELECT b FROM Breweries b WHERE b.address1 = :address1"),
@NamedQuery(name = "Breweries.findByAddress2", query = "SELECT b FROM Breweries b WHERE b.address2 = :address2"),
@NamedQuery(name = "Breweries.findByCity", query = "SELECT b FROM Breweries b WHERE b.city = :city"),
@NamedQuery(name = "Breweries.findByState", query = "SELECT b FROM Breweries b WHERE b.state = :state"),
@NamedQuery(name = "Breweries.findByCode", query = "SELECT b FROM Breweries b WHERE b.code = :code"),
@NamedQuery(name = "Breweries.findByCountry", query = "SELECT b FROM Breweries b WHERE b.country = :country"),
@NamedQuery(name = "Breweries.findByPhone", query = "SELECT b FROM Breweries b WHERE b.phone = :phone"),
@NamedQuery(name = "Breweries.findByWebsite", query = "SELECT b FROM Breweries b WHERE b.website = :website"),
@NamedQuery(name = "Breweries.findByImage", query = "SELECT b FROM Breweries b WHERE b.image = :image"),
@NamedQuery(name = "Breweries.findByAddUser", query = "SELECT b FROM Breweries b WHERE b.addUser = :addUser"),
@NamedQuery(name = "Breweries.findByLastMod", query = "SELECT b FROM Breweries b WHERE b.lastMod = :lastMod"),
@NamedQuery(name = "Breweries.findByCreditLimit", query = "SELECT b FROM Breweries b WHERE b.creditLimit = :creditLimit"),
@NamedQuery(name = "Breweries.findByEmail", query = "SELECT b FROM Breweries b WHERE b.email = :email")})
public class Breweries implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@Positive(message = "value must be positive")
private Integer id;
@Basic(optional = false)
@NotNull
@Column(name = "name")
@NotBlank(message = " field cannot be empty")
@Size(min = 1, max = 50, message = "must be 50 characters or less")
private String name;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50, message = "must be 50 characters or less")
@Column(name = "address1")
private String address1;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50, message = "must be 50 characters or less")
@Column(name = "address2")
private String address2;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 30, message = "must be 30 characters or less")
@Column(name = "city")
private String city;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 20, message = "must be 20 characters or less")
@Column(name = "state")
private String state;
@Basic(optional = false)
@NotNull
//@Size(min = 1, max = 5, message = "must be 5 digits or less")
@NotBlank(message = " field cannot be empty")
@Pattern(regexp="\d{1,5}", message = "must be 5 digits or less")
//@digit
@Column(name = "code")
private String code;
@Basic(optional = false)
@NotNull()
@Column(name = "country")
@NotBlank(message = " field cannot be empty")
private String country;
// @Pattern(regexp="^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$", message="Invalid phone/fax format, should be as xxx-xxx-xxxx")//if the field contains phone or fax number consider using this annotation to enforce field validation
@Basic(optional = false)
@NotNull()
@NotBlank(message = " field cannot be empty")
@Column(name = "phone")
private String phone;
@Basic(optional = false)
@NotNull
@URL( message = "must be a valid url")
@NotBlank(message = " this field cannot be blank")
@Column(name = "website")
private String website;
@Basic(optional = false)
// @NotNull
@Size(min = 1, max = 255)
@Column(name = "image")
private String image;
@Basic(optional = false)
@NotNull
@Lob
@NotBlank(message = " this field cannot be blank")
@Size(min = 1, max = 65535)
@Column(name = "description")
private String description;
@Basic(optional = false)
@NotNull
@Positive(message = "value must be positive and 2 digits")
// @Digits(integer=2, fraction=0, message = "value must be positive and 2 digits whole number")
@Column(name = "add_user")
private int addUser;
@Basic(optional = false)
// @NotNull
@Past()
@Column(name = "last_mod")
@Temporal(TemporalType.TIMESTAMP)
private Date lastMod;
@Basic(optional = false)
@NotNull
@Digits(integer = 6, fraction = 2, message = "Must have a max of 6 digits before the decimal point and 2 afterwards.")
@Column(name = "credit_limit")
private double creditLimit;
// @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
@Basic(optional = false)
@NotNull
//@Size(min = 1, max = 50)
@NotBlank(message = " this field cannot be blank")
@Column(name = "email")
@Email(message= " this is not a valid email adress")
private String email;
@Column(table = "breweries_geocode")
@NotNull
//@Size(min = -90, max = 90, message = "latitide must be between -90 and 90")
@Max(value = 90, message = "latitide must be between -90 and 90")
@Min(value = -90, message = "latitide must be between -90 and 90")
private float latitude;
@NotNull
@Column(table = "breweries_geocode")
// @Size(min = -180, max = 180, message = "latitide must be between -180 and 180")
@Max(value = 80, message = "latitide must be between -180 and 80")
@Min(value = -180, message = "latitide must be between -180 and 80")
private float longitude;
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Breweries)) {
return false;
}
Breweries other = (Breweries) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "lit.sd4.model.Breweries[ id=" + id + " ]";
}
}
几点注意事项:
Afaik validation-api
只是一个 API,即一组 annotations/interfaces。为了让它工作,你必须添加验证 API 实现,例如hibernate-validator,hibernate-validator-annotation-processor。此外,您必须配置 Validator 并通过 AOP 或其他方式手动将其注入到您的应用程序中,具体取决于您当前的项目设置。
有一个issue,所以尝试将hibernate-validator版本升级到6.1。2.Final作为注解处理器。它以这种方式对我有用。
尝试用@Min(value = 0)
替换@Positive
我的@Positive 注释仍然取负值。
验证字段的代码是
@Basic(optional = false)
@NotNull
@Positive(message = "value must be positive and 2 digits")
@Digits(integer=2, fraction=0, message = "value must be positive and 2 digits whole number")
@Column(name = "add_user")
private int addUser;
我使用的导入是
import javax.validation.constraints.Positive;
我使用的依赖项是
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.9.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.2.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>6.1.2.Final</version>
</dependency>
显示错误的表单域是
<tr>
<td><form:label path="addUser">Add User</form:label></td>
<td><form:input path="addUser"/></td>
<td style="color:red"> <form:errors path="addUser"/> </td>
</tr>
控制器方法是
@PostMapping("/addBrewery")
public ModelAndView addAnBrewery(ModelMap model, @Valid @ModelAttribute("brewerie") Breweries brewerie, BindingResult result) {
if (result.hasErrors()) {
System.out.println(result);
return new ModelAndView("/addBrewery");
}
service.addAnBreweries(brewerie);
return new ModelAndView("redirect:/breweries");
}
Breweries 对象 class 是一个 JPA Breweries.java 的代码如下,由于此问题中的代码量和文本不足,我必须删除 getter 和 setter
@Entity
@Table(name = "breweries")
@SecondaryTable(name = "breweries_geocode", pkJoinColumns = @PrimaryKeyJoinColumn(name = "brewery_id", referencedColumnName = "id"))
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Breweries.findAll", query = "SELECT b FROM Breweries b"),
@NamedQuery(name = "Breweries.findById", query = "SELECT b FROM Breweries b WHERE b.id = :id"),
@NamedQuery(name = "Breweries.findByName", query = "SELECT b FROM Breweries b WHERE b.name = :name"),
@NamedQuery(name = "Breweries.findByAddress1", query = "SELECT b FROM Breweries b WHERE b.address1 = :address1"),
@NamedQuery(name = "Breweries.findByAddress2", query = "SELECT b FROM Breweries b WHERE b.address2 = :address2"),
@NamedQuery(name = "Breweries.findByCity", query = "SELECT b FROM Breweries b WHERE b.city = :city"),
@NamedQuery(name = "Breweries.findByState", query = "SELECT b FROM Breweries b WHERE b.state = :state"),
@NamedQuery(name = "Breweries.findByCode", query = "SELECT b FROM Breweries b WHERE b.code = :code"),
@NamedQuery(name = "Breweries.findByCountry", query = "SELECT b FROM Breweries b WHERE b.country = :country"),
@NamedQuery(name = "Breweries.findByPhone", query = "SELECT b FROM Breweries b WHERE b.phone = :phone"),
@NamedQuery(name = "Breweries.findByWebsite", query = "SELECT b FROM Breweries b WHERE b.website = :website"),
@NamedQuery(name = "Breweries.findByImage", query = "SELECT b FROM Breweries b WHERE b.image = :image"),
@NamedQuery(name = "Breweries.findByAddUser", query = "SELECT b FROM Breweries b WHERE b.addUser = :addUser"),
@NamedQuery(name = "Breweries.findByLastMod", query = "SELECT b FROM Breweries b WHERE b.lastMod = :lastMod"),
@NamedQuery(name = "Breweries.findByCreditLimit", query = "SELECT b FROM Breweries b WHERE b.creditLimit = :creditLimit"),
@NamedQuery(name = "Breweries.findByEmail", query = "SELECT b FROM Breweries b WHERE b.email = :email")})
public class Breweries implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@Positive(message = "value must be positive")
private Integer id;
@Basic(optional = false)
@NotNull
@Column(name = "name")
@NotBlank(message = " field cannot be empty")
@Size(min = 1, max = 50, message = "must be 50 characters or less")
private String name;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50, message = "must be 50 characters or less")
@Column(name = "address1")
private String address1;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 50, message = "must be 50 characters or less")
@Column(name = "address2")
private String address2;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 30, message = "must be 30 characters or less")
@Column(name = "city")
private String city;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 20, message = "must be 20 characters or less")
@Column(name = "state")
private String state;
@Basic(optional = false)
@NotNull
//@Size(min = 1, max = 5, message = "must be 5 digits or less")
@NotBlank(message = " field cannot be empty")
@Pattern(regexp="\d{1,5}", message = "must be 5 digits or less")
//@digit
@Column(name = "code")
private String code;
@Basic(optional = false)
@NotNull()
@Column(name = "country")
@NotBlank(message = " field cannot be empty")
private String country;
// @Pattern(regexp="^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$", message="Invalid phone/fax format, should be as xxx-xxx-xxxx")//if the field contains phone or fax number consider using this annotation to enforce field validation
@Basic(optional = false)
@NotNull()
@NotBlank(message = " field cannot be empty")
@Column(name = "phone")
private String phone;
@Basic(optional = false)
@NotNull
@URL( message = "must be a valid url")
@NotBlank(message = " this field cannot be blank")
@Column(name = "website")
private String website;
@Basic(optional = false)
// @NotNull
@Size(min = 1, max = 255)
@Column(name = "image")
private String image;
@Basic(optional = false)
@NotNull
@Lob
@NotBlank(message = " this field cannot be blank")
@Size(min = 1, max = 65535)
@Column(name = "description")
private String description;
@Basic(optional = false)
@NotNull
@Positive(message = "value must be positive and 2 digits")
// @Digits(integer=2, fraction=0, message = "value must be positive and 2 digits whole number")
@Column(name = "add_user")
private int addUser;
@Basic(optional = false)
// @NotNull
@Past()
@Column(name = "last_mod")
@Temporal(TemporalType.TIMESTAMP)
private Date lastMod;
@Basic(optional = false)
@NotNull
@Digits(integer = 6, fraction = 2, message = "Must have a max of 6 digits before the decimal point and 2 afterwards.")
@Column(name = "credit_limit")
private double creditLimit;
// @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
@Basic(optional = false)
@NotNull
//@Size(min = 1, max = 50)
@NotBlank(message = " this field cannot be blank")
@Column(name = "email")
@Email(message= " this is not a valid email adress")
private String email;
@Column(table = "breweries_geocode")
@NotNull
//@Size(min = -90, max = 90, message = "latitide must be between -90 and 90")
@Max(value = 90, message = "latitide must be between -90 and 90")
@Min(value = -90, message = "latitide must be between -90 and 90")
private float latitude;
@NotNull
@Column(table = "breweries_geocode")
// @Size(min = -180, max = 180, message = "latitide must be between -180 and 180")
@Max(value = 80, message = "latitide must be between -180 and 80")
@Min(value = -180, message = "latitide must be between -180 and 80")
private float longitude;
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Breweries)) {
return false;
}
Breweries other = (Breweries) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "lit.sd4.model.Breweries[ id=" + id + " ]";
}
}
几点注意事项:
Afaik
validation-api
只是一个 API,即一组 annotations/interfaces。为了让它工作,你必须添加验证 API 实现,例如hibernate-validator,hibernate-validator-annotation-processor。此外,您必须配置 Validator 并通过 AOP 或其他方式手动将其注入到您的应用程序中,具体取决于您当前的项目设置。有一个issue,所以尝试将hibernate-validator版本升级到6.1。2.Final作为注解处理器。它以这种方式对我有用。
尝试用
@Min(value = 0)
替换
@Positive