Spring Boot - доступ к свойствам сущности JPA в методе контроллера
Я испытываю трудности с доступом к данным экземпляра сущности JPA в моем контроллере Spring Boot.
Это сущности:
Пользователь:
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(unique=true, length=50)
private String username;
@OneToMany(cascade = CascadeType.ALL)
private List<Authority> authorities = new ArrayList<>();
}
Власть:
@Entity
@Data
public class Authority {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@NotNull
private String authority;
}
UserRepository:
public interface UserRepository extends CrudRepository<User, Long> {
Optional<User> findByUsername(String username);
}
Это метод контроллера:
@RestController
public class InfoController {
@RequestMapping(value="/userinfo", method= RequestMethod.GET)
public Optional<User> getUser() {
Optional<User> foundUser = repository.findByUsername("testuser");
return foundUser;
}
}
Когда я получаю доступ к /userinfo в моем браузере, я получаю это:
{
"id": 1,
"username": "testuser",
"password": "",
"enabled": true,
"authorities": [
{
"id": 1,
"authority": "ADMIN"
}
]
}
Так что все в порядке, пока выгляжу хорошо, но я хочу перебрать свойство полномочий объекта User в контроллере, но я не могу получить к нему доступ (или любое другое свойство). Я пытался использовать такие методы, как:
foundUser.getAuthorities();
foundUser.authorities;
foundUser.get('authorities');
.... Но ни один из этих методов не существует. Как мне это сделать?
2 ответа
Обратите внимание, что foundUser
является Optional<User>
и не User
, так что вы не можете вызывать методы класса User
в теме.
Вы должны получить User
вне Optional
чтобы получить доступ к его атрибутам:
if (foundUser.isPresent()) {
User user = foundUser.get();
List<Authority> authorities = user.getAuthorities();
// Do what you need to do with the list of authorities
}
Вы также можете использовать функциональный стиль программирования, используя методы, доступные в классе. Optional
такие как map
, Например, если вы хотите получить только имя пользователя в Optional
когда он найден, вы можете сделать это:
// Transforms the Optional<User> to an Optional<String> containing the username
Optional<String> username = foundUser.map(User::getUsername);
Или список властей в Optional
:
Optional<List<Authority>> authorities = foundUser.map(User::getAuthorities);
Optional
представляет объект, который либо содержит значение, либо ничего. Ваш репозиторий вернет Optional
содержащий User
объект, когда пользователь был найден, или пустой Optional
если пользователь не был найден.
Вы вызываете методы на Optional
объект, а не фактический User
объект.
Вы можете получить User
возражать User actualUser = foundUser.get()
,
Обратите внимание, что призыв к Optional.get()
бросает NoSuchElementException
если нет значения.