简体   繁体   中英

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

I have following problem. This is my entity:

    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;
    }

dao layer:

    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;
        }

    }

service layer:

    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));
        }
    }

and controller:

    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);
        }

    }

I want to validate field in my User entity, I add validation constraints to Entity and @Valid annotation in controller - next to @RequestBody . I used this tutorial how to do it: https://mkyong.com/spring-boot/spring-rest-validation-example/ After build I still can send json to /customer/register with payload with empty fields:

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

User is successfully registered, although annotations in User entity should not allow to do this? Do you see what i'm doing wrong?

My project is Spring, in tutorial we have SpringBoot, there's a difference? Also i have a dao and service layer between entity and controller and i using lombok's @Data annotation. These details make a difference here or is the error elsewhere?

try to add BindingResults like this

 @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 进行注释

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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