Spring Boot - доступ к свойствам сущности JPA в методе контроллера - PullRequest
0 голосов
/ 28 августа 2018

У меня проблемы с доступом к данным экземпляра сущности 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 ]

0 голосов
/ 28 августа 2018

Вы вызываете методы для объекта Optional, а не для фактического объекта User.

Вы можете получить объект User, вызвав User actualUser = foundUser.get().

Обратите внимание, что вызов Optional.get() выдает NoSuchElementException, если значение отсутствует.

0 голосов
/ 28 августа 2018

Обратите внимание, что 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, если пользователь не был найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...