Исключение при добавлении роли из DTO в Entity - PullRequest
0 голосов
/ 15 ноября 2018

Столкнулся с непонятной для меня проблемой: когда я пытаюсь добавить роль пользователя, система переходит в рефлексию и выдает исключение NullPointerException вместо того, чтобы брать значение роли из DAO.

Организация:

@Entity
@Table(name = "users")
public class User implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "email", unique = true, nullable = false)
private String email;

@Column(name = "password", nullable = false)
private String password;

@Column(name = "first_name", length = 50, nullable = false)
private String firstName;

@Column(name = "last_name", length = 50, nullable = false)
private String lastName;

@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Column(name = "birth_date", nullable = false)
private Date birthDate;

@ManyToOne
@JoinColumn(name = "role")
private Role role;

// getter & setter

и

@Entity
@Table(name = "roles")
public class Role implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "name")
private String name;

@OneToMany(mappedBy = "role")
private Set<User> users;

// getter & setter

DAO (роль):

@Repository
public class RoleDaoImpl extends AbstractGenericDao<Role> implements RoleDao {

private static final Logger LOG = Logger.getLogger(RoleDaoImpl.class.getName());

private static final String GET_ROLE_BY_NAME = "SELECT r FROM Role r WHERE r.name = :name";

@Override
public Role getRoleByName(String name) {
    Query query = getCurrentSession().createQuery(GET_ROLE_BY_NAME);
    query.setParameter("name", name);

    Role role = null;
    try {
        role = (Role) query.getSingleResult();
    } catch (Exception e) {
        LOG.warn(e);
    }
    return role;
}

}

Теперь я пытаюсь преобразовать свое userDto (оно повторяет сущности, но не содержит id и роль). Все работает, пока я не попытаюсь добавить user.addRole:

    public static User constructUser(UserDto userDto) {
    User user = new User();
    user.setEmail(userDto.getEmail());
    user.setPassword(userDto.getPassword());
    user.setFirstName(userDto.getFirstName());
    user.setLastName(userDto.getLastName());
    user.setBirthDate(DateConverter.convertDate(userDto.getBirthDate()));
    //user.setRole(roleDao.getRoleByName("ROLE_USER"));
    return user;
}

Как только дело доходит до закомментированной строки, компилятор не входит в DAO, он входит в рефлексию и пытается что-то там сделать и возвращает NullPointer.

Расскажите неопытному, в чем может быть дело и как это исправить. У всего этого болит голова.

Таблицы существуют, значения действительны. Без DTO (через сущность) все работает нормально.

...