繁体   English   中英

Spring:在控制器发布请求方法中使用@Valid 注释验证@Entity 字段

[英]Spring: validating @Entity fields with @Valid annotation in controller post request method

我有以下问题。 这是我的实体:

    package application.model;

    import lombok.Data;
    import javax.persistence.*;
    import javax.validation.Valid;
    import javax.validation.constraints.*;
    import java.util.List;

    @NamedQueries({
            @NamedQuery(name = User.GET_USERS, query = User.QUERY_GET_USERS),
            @NamedQuery(name = User.VERIFY_CREDENTIALS, query = User.QUERY_VERIFY_CREDENTIALS),
            @NamedQuery(name = User.GET_USER_ROLE, query = User.QUERY_GET_USER_ROLE),
            @NamedQuery(name = User.GET_USER_ID_BY_EMAIL, query = User.QUERY_GET_USER_ID_BY_EMAIL)
    })

    @Data
    @Entity
    @Table(name = "users")
    public class User {
        public static final String GET_USERS = "User.get_users";
        public static final String QUERY_GET_USERS = "select u from User u";

        public static final String VERIFY_CREDENTIALS = "User.verify_credentials";
        public static final String QUERY_VERIFY_CREDENTIALS = "select u from User u where u.email = :email and u.password = :password";

        public static final String GET_USER_ROLE = "User.get_role";
        public static final String QUERY_GET_USER_ROLE = "select u.roles from User u where u.id= :id";

        public static final String GET_USER_ID_BY_EMAIL = "User.get_userId_by_mail";
        public static final String QUERY_GET_USER_ID_BY_EMAIL = "select u from User u where u.email= :email";

    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    public int id;

    @NotEmpty(message="provide firstname")
    @Size(min=4,message = "minimum 4 chars")
    @Column(name="firstname",nullable = false)
    private String firstname;

    @NotEmpty(message="provide lastname")
    @Size(min=4,message = "minimum 4 chars")
    @Column(name="lastname",nullable = false)
    private String lastname;

    @NotEmpty(message="provide mail")
    @Email(message = "mail should be valid")
    @Column(name="email",unique = true,nullable = false)
    private String email;

    @NotEmpty(message="provide pass")
    @Size(min=4,message = "minimum 4 chars")
    @Column(name="password",nullable = false)
    private String password;

    @ManyToMany
    @JoinTable(name="user_roles")
    private List<Role> roles;
    }

道层:

    package application.dao;
    import application.model.Role;
    import application.model.User;
    import org.springframework.stereotype.Repository;
    import org.springframework.transaction.annotation.Transactional;
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;

    @Repository
    public class UserDAOImpl implements UserDAO {

        @PersistenceContext(type = PersistenceContextType.EXTENDED)
        private EntityManager em;

        @Transactional
        @Override
        public User addUser(User user) {
            return em.merge(user);
        }


        @Override
        public User addCustomerRole(User user) {
            List<Role> roles= new ArrayList<>();
            roles.add(em.find(Role.class,3));
            user.setRoles(roles);
            return user;
        }

        @Override
        public User addSellerRole(User user) {
            List<Role> roles= new ArrayList<>();
            roles.add(em.find(Role.class,2));
            user.setRoles(roles);
            return user;
        }

    }

服务层:

    package application.service;

    import application.controller.CommonAPIController;
    import application.dao.UserDAO;
    import application.model.User;
    import org.apache.log4j.Logger;
    import org.springframework.stereotype.Service;
    import java.util.Collection;
    import java.util.List;

    @Service
    public class UserServiceImpl implements UserService {
        final static Logger LOGGER = Logger.getLogger(UserServiceImpl.class.getName());


        private final UserDAO userDAO;
        public UserServiceImpl(UserDAO userDAO) {
            this.userDAO = userDAO;
        }

        @Override
        public User addCustomer(User user) {
            return userDAO.addCustomerRole(userDAO.addUser(user));
        }
    }

和控制器:

    package application.controller;

    import application.model.User;
    import application.service.UserService;
    import org.springframework.web.bind.annotation.*;
    import javax.validation.Valid;

    @RestController
    public class CustomerAPIController {

        private final UserService userService;

        public CustomerAPIController(UserService userService) {
            this.userService = userService;
        }

        @PostMapping(value = "/customer/register")
        public User addCustomer(@RequestBody @Valid User user){
            return userService.addCustomer(user);
        }

    }

我想验证我的用户实体中的字段,我将验证约束添加到 Entity 和控制器中的@Valid注释 - 在@RequestBody旁边。 我使用本教程如何做到这一点: https : //mkyong.com/spring-boot/spring-rest-validation-example/构建后,我仍然可以将带有空字段的有效负载的 json 发送到 /customer/register:

    {
            "firstname": "",
            "lastname": "",
            "email": "",
            "password": "pass"
        }

用户已成功注册,尽管用户实体中的注释不应允许这样做? 你看到我在做什么错了吗?

我的项目是Spring,教程里我们有SpringBoot,有区别吗? 此外,我在实体和控制器之间有一个 dao 和服务层,我使用 lombok 的 @Data 注释。 这些细节在这里有所作为还是其他地方的错误?

尝试像这样添加 BindingResults

 @PostMapping(value = "/customer/register")
 public User addCustomer(@RequestBody   @valid BindingResults result,User user){
    if(results.hasErrors()){
    return some error page;
}
       else{
            return userService.addCustomer(user);
        }

确保您的控制器类使用@Validated 进行注释

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM