Я хочу создать страницу с информацией о текущем зарегистрированном пользователе и редактировать их.Но когда я хочу показать детали, я получил ошибку:
org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'username' cannot be found on null
userDetails.html
<span th:text="${oneUser.username}"> username: </span>
<span th:text="${oneUser.password}"> password: </span>
<span th:text="${oneUser.email}"> email: </span>
Я попытался изменить на:
<span th:text="${oneUser == null ? ' ' : oneUser.username}"> username: </span>
но у меня есть только страница, на которой ничего не отображается без ошибок
UserController.java
@GetMapping("/registerUser")
public String home(Model model) {
model.addAttribute("userNew", new User());
return "registerUser";
}
@GetMapping("/userDetails")
public String show(@ModelAttribute User details, Model modelDetals) {
final String currentUserName = SecurityContextHolder.getContext().getAuthentication().getName();
details = userRepository.findByUsername(currentUserName);
modelDetals.addAttribute("oneUser", details);
return "userDetails";
}
UserRepository.java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
User findByUsername(String username);
}
User.java
@Entity
@Table(name = "users")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_user")
private Long id;
@Column(name = "login", nullable = false, unique = true)
private String username;
@NotEmpty
private String password;
@NotEmpty
private String email;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id_details")
private UserDetails details;
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
private Set<UserRole> roles = new HashSet<>();
@OneToMany
private List<Order> orders;
public User() {
}
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public UserDetails getDetails() {
return details;
}
public void setDetails(UserDetails details) {
this.details = details;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
public Set<UserRole> getRoles() {
return roles;
}
public void setRoles(Set<UserRole> roles) {
this.roles = roles;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email
+ ", details=" + details + orders.size() + ", orders=" + orders + "]";
}
}
Второй вопрос: как оперировать этими деталями.Я имею в виду, например, у меня есть вторая страница для редактирования деталей.Как получить текущего зарегистрированного пользователя и изменить эти данные, используя UserRepository.java, чтобы сохранить пользователя с новыми данными, предварительно получая имя пользователя, как в этом случае?