2016-10-09 5 views
1

В настоящее время у меня есть полностью работоспособное приложение Spring, которое очень тщательно протестировано и успешно работает в производстве уже более года. В последнее время я хотел иметь проверку подлинности спящего режима в поле имени пользователя. Поле имени пользователя используется для входа в систему, а также является электронной почтой наших пользователей.Spring или Hibernate не генерируют идентификатор, когда имя пользователя аннотируется с помощью @email

Когда я аннотировать username поля с @Email, идентификатор (аннотированный с @Id и @Generated(strategy = GenerationType.AUTO)) не генерируется больше, и сохраняет значение null. Это приводит к ошибке hashCode на NullPointerException (никаких проблем с этим, хотя). Поэтому по какой-то причине идентификатор больше не генерируется из-за добавления аннотации @Email к объекту User.java.

@Entity 
@Table(uniqueConstraints = @UniqueConstraint(name = "username", 
columnNames = "username")) 
public class User implements Serializable, UserDetails { 

    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Id 
    private Long id; 

    @Column(nullable = false) 
    @JsonView(View.NoProfile.class) 
    @Email 
    protected String username; 

    @Column(nullable = false) 
    private String passwordHash; 

    @JsonIgnore 
    @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER) 
    @Enumerated(EnumType.STRING) 
    @CollectionTable(name = "user_role") 
    private Set<Role> roles; 

    @OneToOne(targetEntity = Profile.class, cascade = CascadeType.ALL) 
    @JsonView(View.Public.class) 
    protected Profile profile; 

    @JsonIgnore 
    private boolean accountNonExpired = true; 
    @JsonIgnore 
    private boolean accountNonLocked = true; 
    @JsonIgnore 
    private boolean credentialsNonExpired = true; 
    @JsonIgnore 
    private boolean enabled = true; 

    public User(String username, String passwordHash) { 
     this.username = username; 
     this.passwordHash = passwordHash; 
     this.profile = new Profile(); 
     this.roles = new HashSet<>(); 
     roles.add(Role.ROLE_USER); 
    } 

    User() { // jpa only 
    } 

    public Profile getProfile() { 
     return profile; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setPasswordHash(String passwordHash) { 
     this.passwordHash = passwordHash; 
    } 

    @Override 
    public Set<? extends GrantedAuthority> getAuthorities() { 
     return roles; 
    } 

    @Override 
    @JsonIgnore 
    public String getPassword() { 
    return passwordHash; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    @Override 
    public boolean isAccountNonExpired() { 
     return accountNonExpired; 
    } 

    @Override 
    public boolean isAccountNonLocked() { 
     return accountNonLocked; 
    } 

    @Override 
    public boolean isCredentialsNonExpired() { 
     return credentialsNonExpired; 
    } 

    @Override 
    public boolean isEnabled() { 
     return enabled; 
    } 

    public void resetProfile() { 
     this.profile = new Profile(); 
    } 

    public void addRole(Role role) { 
     this.roles.add(role); 
    } 

    public void setAccountNonLocked(boolean accountNonLocked) { 
     this.accountNonLocked = accountNonLocked; 
    } 

    public void setEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 

    @JsonView(View.Public.class) 
    public int getReference() { 
     return username.hashCode(); 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) { 
      return true; 
     } 
     if (o == null || getClass() != o.getClass()) { 
      return false; 
     } 

     User user = (User) o; 

     return username.equals(user.username) && id.equals(user.id); 

    } 

    @Override 
    public int hashCode() { 
     int result = username.hashCode(); 
     result = 31 * result + id.hashCode(); 
     return result; 
    } 
} 
+0

Вы еще не изменили схему или сущность базы данных? А потом не удалось обновить? – Snickers3192

+0

У вас есть? <свойство name = "hibernate.hbm2ddl.auto"> обновление, или создать тоже хорошо. – Snickers3192

+0

Это происходит либо из 'create', либо' create-drop', поэтому база данных должна быть права. – martijn9612

ответ

0

Проблема может заключаться в том, что при попытке сохранить спящий режим пользователя проверяет, действительно ли оно. Если проблема с именем пользователя по электронной почте, hibernate не пытается ее сохранить, значит, id не генерирует идентификатор.

Но что происходит с ошибкой проверки? Я думаю, что это возможно замаскировано NPE, о котором вы говорите в методе hashCode. Попробуйте переписать хэш-код, позаботясь о возможном NPE, и проверить наличие ограничений на спящий режим.

+1

Итак, я переписал хэш-код, чтобы иметь дело с NPE. Он работает сейчас, но это было не то решение, которое я изначально хотел. Поэтому из того, что я могу заключить, заключается в том, что аннотация @ @ email заставляет хэш-код генерировать раньше, а генерация идентификатора - позже. Поскольку без аннотации @ @ email, нулевая проверка никогда не нужна (идентификатор был сгенерирован до хэш-кода). – martijn9612