У меня следующая проблема. Это моя сущность:
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);
}
}
Я хочу проверить поле в моей сущности пользователя, я добавляю ограничения проверки к сущности и аннотацию @Valid
в контроллере - рядом с @RequestBody
. Я использовал это руководство, как это сделать: https://mkyong.com/spring-boot/spring-rest-validation-example/ После сборки я все еще могу отправить json в / customer / register с полезными данными с пустыми полями:
{
"firstname": "",
"lastname": "",
"email": "",
"password": "pass"
}
Пользователь успешно зарегистрирован, хотя аннотации в сущности пользователя не должны позволять это делать? Вы понимаете, что я делаю неправильно?
Мой проект Spring, в уроке у нас есть SpringBoot, есть разница? Также у меня есть слой dao и сервис между сущностью и контроллером, и я использую аннотацию @Data от lombok. Эти детали имеют значение здесь или ошибка в другом месте?