当前位置: 首页 > 知识库问答 >
问题:

我应该如何将jparepository.findone()与SpringBoot一起使用?

陶宜民
2023-03-14

我是通过阅读Spring Boot in Action这本书开始学习Spring Boot的,我正在学习这本书中的示例,试图自己运行它们,但我在使用jparepository.findone()时遇到了问题。

我已经翻遍了这一章,寻找我可能的不匹配。然而,它就是不起作用。

这个项目应该是一个简单的阅读清单。

代码如下:

读者@实体:

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> {
}
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>)

共有1个答案

金秦斩
2023-03-14

findOne()定义为 可选 findOne(example example); .
意味着在您的情况下,它接受 示例 并返回 可选
您向它传递了一个 字符串,这是错误的,您将它用作 authenticationManagerBuilder.userdetailsService()中的lambda返回,这也是错误的,因为

 
  
   UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

  
 

因此,您需要返回 UserDetails实例,而不是 可选实例,或者抛出 UserNameNotFoundException,如果没有与javadoc兼容的用户名匹配:

返回:

完全填充的用户记录(从不为空)

投掷:

所以你可以这样写:

 
  
   @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的评论很有趣。所以我现在就测试了。当Spring Security类访问实体(即 isAccountnonLocked())时,JPA会话恰好没有打开。
因此在任何情况下(用户名正确或否)都会引发 LazyInitializationException:

 
  
   
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
        at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:155)
        at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:268)
        at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73)
        at davidhxxx.example.angularsboot.model.db.User_$$_jvstd90_5.isAccountNonLocked(User_$$_jvstd90_5.java)
        at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider$DefaultPreAuthenticationChecks.check(AbstractUserDetailsAuthenticationProvider.java:352)
        at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:165)

  
 

这个问题可能会引起你的兴趣。

 类似资料:
  • 我有一个正常工作的普通Hapi应用程序,我计划迁移到Swagger。我使用官方说明安装了swagger-node,并在执行“swagger项目创建”时选择了Hapi。但是,我现在很困惑,因为似乎有几个库用于集成swagger-node和hapi: < li>hapi-swagger:最受欢迎的一款 < Li > hapi-waggered:有点流行 < li>swagger-hapi:不受欢迎且不

  • 问题内容: 如何将chmod与Node.js一起使用? 程序包中有一个方法应该执行此操作,但是我不知道第二个参数是什么。 fs.chmod(路径,模式,[回调]) 异步chmod(2)。除了可能的异常外,没有其他参数被赋予完成回调。 fs.chmodSync(路径,模式) 同步chmod(2)。 (来自Node.js文档) 如果我做类似的事情 没有任何反应(文件未更改为该模式)。 也不起作用。 我

  • 我试图创建一个简单的SpringBoot应用程序来连接和存储数据库中的一些数据,但是当我的代码试图提交一个新对象时,仍然会遇到401禁止消息。 我应该如何使用SpringBoot连接到ArangoDb,以便能够在数据库中保存节点? 我的系统上运行了ArangoDb,我可以在localhost登录到web控制台:http://localhost:8529 我有一个与下面的属性同名的数据库。我还尝试在

  • 我在Ubuntu 14.04中安装了phpbrew以使用PHP5.4。它工作得很好,但当我尝试使用composer时除外,composer会忽略phpbrew并安装与PHP5.5相关的依赖项。 有没有办法强制composer与phpbrew config兼容?我试图在我的作曲家中添加:php:“5.4”。json,但是它说这个要求在我的php版本中是不可能的。

  • 我是Micronaut框架的新手,我正在尝试使用entitymanager创建我的存储库。我这样创建了我的存储库 我使用这个类实现接口并注入entitymanager 问题是我一直有这个错误: PS:我已经启用了注释处理

  • 我正在尝试将composer与我的WampServer一起使用。 我所有文件的路径都是,但当我运行composer时,它会将供应商文件和其他东西安装到其他地方。 我甚至不知道我的项目在哪里,我也不能改变我的项目在哪里的路径。我已经尝试了所有的方法,但它似乎仍然没有在我的项目文件夹中安装供应商文件。