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 если нет значения.

Другие вопросы по тегам