获取错误“;未找到能够从java.lang.String类型转换为org.springframework.security.core.GrantedAuthority类型的转换器;

获取错误“;未找到能够从java.lang.String类型转换为org.springframework.security.core.GrantedAuthority类型的转换器;,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我在我的应用程序中使用Spring引导和Spring安全性。当我从数据库中获取用户时,我遇到以下错误,即使我包含了它的所有依赖项: 未找到能够从java.lang.String类型转换为org.springframework.security.core.GrantedAuthority类型的转换器 这是如何造成的,我如何解决 我的实体是 public class User { public static final String USERNAME = "username"; pu

我在我的应用程序中使用Spring引导和Spring安全性。当我从数据库中获取用户时,我遇到以下错误,即使我包含了它的所有依赖项:

未找到能够从java.lang.String类型转换为org.springframework.security.core.GrantedAuthority类型的转换器

这是如何造成的,我如何解决

我的实体是

public class User {
    public static final String USERNAME = "username";
    public static final String PASSWORD = "password";
    public static final String ROLES = "roles";

    @Id String id;

    String firstName;

     @JsonProperty(PASSWORD)
    String password;

    @JsonProperty(USERNAME)
    String userName;

    @JsonProperty(ROLES)
    @JsonSerialize(contentUsing = GrantedAuthoritySerializer.class)
    @JsonDeserialize(contentUsing = GrantedAuthorityDeserializer.class)
    private List<GrantedAuthority> roles;



    public String getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

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

    public String getPassword() {
        return password;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

     public List<GrantedAuthority> getRoles() {
            System.out.println("roles"+roles);
            return roles;
        }

     @Override
        public String toString() {
            return new ToStringBuilder(this)
                    .append("username", userName)
                    .append("password", password)
                    .append("roles", roles)
                    .toString();
        }
授权提供者

UserDetails loadedUser;

        System.out.println("username"+username);

        try {
             com.samepinch.domain.user.User samepinchuser = userService.findUserByUsername(username);
            System.out.println("samepinchuser"+samepinchuser);
            loadedUser = new User(samepinchuser.getUserName(), samepinchuser.getPassword(),samepinchuser.getRoles());
            System.out.println("loaded user"+loadedUser);
        } catch (Exception repositoryProblem) {
            throw new InternalAuthenticationServiceException(repositoryProblem.getMessage(), repositoryProblem);
        }

该错误所抱怨的转换器是JPA
AttributeConverter
GrantedAuthority
不是JPA实体,因此需要一种方法将其映射到数据库列。您有两种选择:

  • 创建一个
    AttributeConverter
    ,它将
    授予的权限
    转换为
    字符串
    (并根据界面返回)。
    AttributeConverter
    需要包含在JPA实体扫描的类中(将其放在与实体相同的包中应该可以工作)

  • 将权限建模为
    List
    ,然后使用
    AuthorityUtils.createAuthorityList(String…
    )提供一个get方法,该方法仅转换为
    List


  • 建议使用第一种方法。
    UserDetails loadedUser;
    
            System.out.println("username"+username);
    
            try {
                 com.samepinch.domain.user.User samepinchuser = userService.findUserByUsername(username);
                System.out.println("samepinchuser"+samepinchuser);
                loadedUser = new User(samepinchuser.getUserName(), samepinchuser.getPassword(),samepinchuser.getRoles());
                System.out.println("loaded user"+loadedUser);
            } catch (Exception repositoryProblem) {
                throw new InternalAuthenticationServiceException(repositoryProblem.getMessage(), repositoryProblem);
            }