Spring Boot Bean Validation示例

在这个示例中,我们将演示如何在Spring Boot REST应用程序中使用Bean Validation。

简介

数据验证是许多应用程序的基本要求,尤其是对于以数据作为输入的Web应用程序。例如,您可能要确保请求中发送的电子邮件地址或信用卡 是有效的。

在引入Java Bean Validation API之前,JEE开发人员往往需要专门编写逻辑来对数据进行验证。对于开发人员而言,这是一项繁琐且耗时的任务。这也导致难以维护的笨拙的代码库,因为验证代码可能在应用程序的多个层中实现(例如,表示层,服务层和持久层)。Bean Validation规范正好可以解决这些问题。

示例

1.创建Spring Boot项目

在pom.xml中添加依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId></dependency>

2.验证JPA实体类

一种常见的做法是向类中添加约束。由于模型通常可供JEE应用程序的所有层访问,因此可以避免代码重复。让我们通过创建JPA实体类并向其字段添加约束来演示这一点。

User.java

import java.time.LocalDate;import java.util.List; import javax.persistence.ElementCollection;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.validation.constraints.Email;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.Past;import javax.validation.constraints.Pattern; import com.fasterxml.jackson.annotation.JsonFormat; @Entitypublic class User {  @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id;  @NotEmpty(message = "First name is required") private String firstName;  @NotEmpty(message = "Last name is required") private String lastName;  @NotEmpty(message = "Email is required") @Email private String email;  @NotEmpty(message = "Phone number is required") @Pattern(regexp="^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$", message="Mobile number is invalid") private String mobilePhone;  @Past @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate birthday;  @NotEmpty(message = "Communication preference is required") private String commPreference;  @ElementCollection private List<@NotEmpty String> mobileDevices;  public long getId() { return id; }  public void setId(long id) { this.id = id; }  public String getFirstName() { return firstName; }  public void setFirstName(String firstName) { this.firstName = firstName; }  public String getLastName() { return lastName; }  public void setLastName(String lastName) { this.lastName = lastName; }  public String getEmail() { return email; }  public void setEmail(String email) { this.email = email; }  public String getMobilePhone() { return mobilePhone; }  public void setMobilePhone(String mobilePhone) { this.mobilePhone = mobilePhone; }  public LocalDate getBirthday() { return birthday; }  public void setBirthday(LocalDate birthday) { this.birthday = birthday; }  public String getCommPreference() { return commPreference; }  public void setCommPreference(String commPreference) { this.commPreference = commPreference; }  public List<String> getMobileDevices() { return mobileDevices; }  public void setMobileDevices(List<String> mobileDevices) { this.mobileDevices = mobileDevices; } }

在User实体类中用到的注解如下:

  • @Entity – 这个类级别的注解通知JPA提供程序(在我们的示例中为Hibernate)该Java类应持久化到数据库表中.
  • @Id@Id – 这个字段级注解指定实体的主键,并将其映射到表的主键。
  • @GeneratedValue – 该注解指定如何生成主键ID。在我们的示例中,我们选择了GenerationType.AUTO,这意味着JPA提供程序(Hibernate)将根据所使用的数据库方言来决定采用哪种策略。 (在此示例中使用了H2Dialect。)
  • @ElementCollection – 该注解指定与可嵌入对象或基本值(例如字符串的集合)一对多的关系。
  • @NotEmpty – 带注释的元素不为null也不为空
  • @EmailTests – 指定的字符序列是格式正确的电子邮件地址
  • @Pattern – 带注释的字符串是否与“regex”属性指定的正则表达式匹配
  • @PastTest – 注释日期是否为过去
  • 3.创建User Repository

    UserRepository.java

    import org.springframework.data.repository.CrudRepository; import com.javacodegeeks.examples.entities.User; public interface UserRepository extends CrudRepository<User, Long> { }

    4.创建REST Controller

    UserController.java

    import javax.validation.Valid; import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; import com.javacodegeeks.examples.entities.User;import com.javacodegeeks.examples.repository.UserRepository; @RestController@RequestMapping("users")public class UserController {  private final UserRepository userRepository;  public UserController(UserRepository userRepository) { this.userRepository = userRepository; }  @PostMapping public ResponseEntity<String> addUser(@RequestBody @Valid User user) { userRepository.save(user); return ResponseEntity.ok("User data is valid"); }}

    5.验证 Bean Validation

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2019年10月19日
    下一篇 2019年10月19日

    相关推荐