【问题标题】:Getting error "No converter found capable of converting from type java.lang.String to type org.springframework.security.core.GrantedAuthority"出现错误“找不到能够从 java.lang.String 类型转换为 org.springframework.security.core.GrantedAuthority 类型的转换器”
【发布时间】:2015-05-15 16:23:45
【问题描述】:

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

没有找到能够从 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();
        }

用户服务

User user = userRepository.findById("5555c3e77d6e5b11dd4ff858");

身份验证提供者

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

【问题讨论】:

    标签: java spring spring-mvc spring-boot


    【解决方案1】:

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

    1. 创建一个AttributeConverter,将GrantedAuthority 转换为String(并根据界面返回)。 AttributeConverter 需要包含在为 JPA 实体扫描的类中(将其放在与您的实体相同的包中应该可以工作)。

    2. 将权限建模为List&lt;String&gt;,然后提供一个使用AuthorityUtils.createAuthorityList(String...) 转换为List&lt;GrantedAuthority&gt; 的get 方法。

    【讨论】:

    • 推荐第一个选项。
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多