どのように私はSpringBootでJpaRepository.findOne()を使用する必要がありますか?

ジャスティン・リー:

私はちょうどこの本読んで春ブーツを習い始めアクションに春ブーツをし、私は例学習、本書のを彼らに自分自身を実行しようとしているが、私は使用して問題を抱えていますJpaRepository.findOne()

私は自分の可能性の不一致を見つけるために、章総模様行ってきました。しかし、それだけでは動作しません。

このプロジェクトは、単純なリーディングリストであると考えられます。

ここでは、コードは次のようになります。

読者@Entity:

package com.lixin.readinglist;

import org.springframework.data.annotation.Id;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.persistence.Entity;
import java.util.Collection;
import java.util.Collections;

/**
 * @author lixin
 */
@Entity
public class Reader implements UserDetails {

    private static final long serialVersionUID = 1L;

    @Id
    private String username;
    private String fullname;
    private String password;

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

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    @Override
    public String getPassword() {
        return password;
    }

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

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return Collections.singletonList(new SimpleGrantedAuthority("READER"));
    }

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

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

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

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

JPAインターフェース:

package com.lixin.readinglist;

import org.springframework.data.jpa.repository.JpaRepository;

/**
 * @author lixin
 */
public interface ReaderRepository extends JpaRepository<Reader, String> {
}

SecurityConfig:

package com.lixin.readinglist;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;

/**
 * @author lixin
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final ReaderRepository readerRepository;

    @Autowired
    public SecurityConfig(ReaderRepository readerRepository) {
        this.readerRepository = readerRepository;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/").access("hasRole('READER')")
                .antMatchers("/**").permitAll()
                .and()
                .formLogin()
                .loginPage("/login")
                .failureUrl("/login?error=true");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService((UserDetailsService) username -> readerRepository.findOne(username));
    }
}

そして、私はこのエラーを取得保管しました:

Error:(40, 86) java: method findOne in interface org.springframework.data.repository.query.QueryByExampleExecutor<T> cannot be applied to given types;
  required: org.springframework.data.domain.Example<S>
  found: java.lang.String
  reason: cannot infer type-variable(s) S
    (argument mismatch; java.lang.String cannot be converted to org.springframework.data.domain.Example<S>)
davidxxx:

findOne()定義されます<S extends T> Optional<S> findOne(Example<S> example);
それはあなたの場合には、それが受け入れることを意味Example<Reader>して返しますOptional<Reader>
あなたはそれに渡さString間違っている、とあなたはでラムダリターンとしてそれを使用するAuthenticationManagerBuilder.userDetailsService()ためにも間違っている、UserDetailsServiceインターフェース機能として定義されています

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

返す必要がありそうUserDetailsでないインスタンスをOptional、それのか、投げるためにUsernameNotFoundExceptionユーザ名と一致があればのjavadocに準拠していないために

戻り値:

フル装備ユーザーレコード(nullにはなりません)

例外:

UsernameNotFoundException - ユーザーが見つかりませんでしたか、ユーザーにはGrantedAuthorityを持っていない場合

あなたが使用する必要はありません。ほかにfindOne()例による問合せです。IDによるクエリは十分です。

だから、あなたはそのような何かを書くことができます:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   auth.userDetailsService(username -> readerRepository.findById(username)
                                                       .orElseThrow( () -> new UsernameNotFoundException("user with username " + username + " not found"));
}

注意点として、getOne()それはいくつかのケースで悪い驚きを与えることが遅延ロードに依存しているようトリッキー十分です。
JB Nizetの発言が面白かったです。だから私は今テストしました。実体が(つまりときJPAセッションがまだ開いていないことが起こるisAccountNonLocked())春のセキュリティクラスによってアクセスされます。
だからLazyInitializationExceptionどのような場合(ユーザー名が正しいか、なし)にスローされます。

org.hibernate.LazyInitializationExceptionは:プロキシを初期化しないことができませんでした-何のセッション
        org.hibernate.proxy.AbstractLazyInitializer.initializeで(AbstractLazyInitializer.java:155)
        org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:268)での
        ORGで。 hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73)
        davidhxxx.example.angularsboot.model.db.User _ $$ _ jvstd90_5.isAccountNonLocked(ユーザ_ $$ _ jvstd90_5.java)で 
        org.springframework.securityで。 authentication.dao.AbstractUserDetailsAuthenticationProvider $ DefaultPreAuthenticationChecks.check(AbstractUserDetailsAuthenticationProvider.java:352)
        org.springframework.securityで。 authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:165)

この質問はあなたに興味があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=178719&siteId=1