Spring Data JPA - findByAlias ​​против findUserByAlias ​​- ошибка с обоими - PullRequest
0 голосов
/ 22 мая 2019

Я использую весеннюю загрузку 2 с JPA и Spring Security.

У меня есть метод обработчика, который, в зависимости от раскрывающегося списка, найдет все ссылки, либо похожие на определенный заголовок, либо опубликованные конкретным пользователем.Я знаю, что моя база данных настроена правильно.

Я получаю исключение нулевого указателя в этой строке:

Optional<User> user = userRepository.findUserByAlias("searchTerm");

Я попытался изменить метод на findByAlias ​​(...) с помощьютот же результат.

Это код моего UserRepository:

public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByEmail(String email);

    Optional<User> findUserByAlias(String alias);

    Optional<User> findByAlias(String alias);
}

, и это мой метод-обработчик, в котором ошибка возникает в этой строке:

Optional<User> user = userRepository.findUserByAlias("searchTerm");
 @GetMapping("/search")
    public String showSearchResults(@RequestParam("searchTerm") String searchTerm, @RequestParam("searchBy") String searchBy, Model model) {
        System.out.println("INSIDE showSearchResults + searchTerm =" + searchTerm);
        List<Link> searchResults;

        if(searchBy.equals("user")) {
            System.out.println("INSIDE IF EQUALS 'user'");
            // get the user by alias
            Optional<User> user = userRepository.findUserByAlias("searchTerm");
            // if the user is present the find all links by the user id
            if (user.isPresent()) {
                searchResults = linkRepository.findAllByUser_Id(user.get().getId());
            } else {
                searchResults = null;
            }
        }

        if(searchBy.equals("title")){
                searchResults = linkRepository.findAllByTitleLike("%" + searchTerm + "%");
        } else {
            searchResults = null;
        }

        model.addAttribute("searchTerm", new SearchTerm());
        model.addAttribute("searchResults", searchResults);

        return "search-results";
    }

и это мой класс пользователя:

@Entity
public class User implements UserDetails {

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

    @Column
    private String email;

    @Column
    private String password;

    @Column
    private boolean enabled;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "users_roles",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")
    )
    private Set<Role> roles = new HashSet<>();


    @Column
    private String firstName;

    @Column
    private String lastName;

    @Column
    private String fullName;

    @Column
    private String alias;

    @Transient
    private String confirmPassword;

    public User(){

    }

    public User(String email, String password, boolean enabled,
                String firstName, String lastName,
                String fullName, String alias) {
        this.email = email;
        this.password = password;
        this.enabled = enabled;
        this.firstName = firstName;
        this.lastName = lastName;
        this.fullName = fullName;
        this.alias = alias;
    }

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

    public void addRoles(Set<Role> roles) {
        roles.forEach(this::addRole);
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isEnabled() {
        return enabled;
    }

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

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFullName() {
        return firstName + " " + lastName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }

    public String getConfirmPassword() {
        return confirmPassword;
    }

    public void setConfirmPassword(String confirmPassword) {
        this.confirmPassword = confirmPassword;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<SimpleGrantedAuthority> authorities = new ArrayList<>();
        for(Role role : roles){
            authorities.add(new SimpleGrantedAuthority(role.getName()));
       }
        return authorities;
    }

    @Override
    public String getUsername() {
        return null;
    }

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

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

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

Итак, у меня два вопроса:

1.) Первый и самый важный - почему я получаю исключение нулевого указателя?Я в растерянности относительно того, что делать с отладкой.

2.) В чем разница между findByAlias ​​и findUserByAlias?

Любой совет будет высоко ценится.

Спасибо за помощь, Марк

1 Ответ

0 голосов
/ 22 мая 2019

Как ваш userRepository вводится в ваш контроллер? Похоже, что это наиболее вероятная причина для нулевого указателя.

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