2

很抱歉用这个问题打扰你,但我最终找到了一个头脚,我想知道我是否以错误的方式处理这个问题。

我想映射一个包含集合的类,org.springframework.security.core.authority.SimpleGrantedAuthority这样我就不需要将 ORM 急切加载的它发送到 spring 安全类中。但是它的“role”属性与getter“getAuthority”相关联,这就是Orika意味着麻烦的时候。我可以强制 Orika 使用 getter 返回的值,将其放入目标类的 setter 中吗?

如果你足够关心,这里有一点我的问题的背景。我正在为应用程序使用 Spring 安全性。我有一个返回 a 的服务,org.springframework.security.core.userdetails.UserDetails以便 spring 可以检查用户是否经过身份验证并且它具有权限。我们拥有的 UserDetail 的实现是一个名为User. 由于此类实现org.springframework.security.core.userdetails.UserDetails,它具有public Collection<? extends GrantedAuthority> getAuthorities();返回该用户权限的方法。

一切都很好,除了我们User在数据库中有这个,用休眠处理。将打开的会话保留在视图中的第一个选择。我们不希望那样。第二个选择是获取ORM,EARGER。我们也不想要那样。因此,我们决定使用 DTO,实现 UserDetail,并用 orika 映射它。就在那时,所有的地狱都崩溃了。org.springframework.security.core.GrantedAuthority是一个接口。我们使用的具体类是org.springframework.security.core.authority.SimpleGrantedAuthority. 这是一个晦涩而致命的映射类,因为它有一个属性名称“role”,但它的getter是“getAuthority”

public String getAuthority() {
    return role;
}

看来Spring战队和Orika战队在哪里不是很要好的朋友。否则,他们会根据 java 标准命名属性,而 orika 会直接映射它。我也不愿意为这种特殊情况定义自定义映射器,这就是困扰我的地方。除了用特定类的自定义映射器替换所有“魔法”之外,是否有任何已知的方法可以强制 Orika 使用 getter 方法返回的值?

4

2 回答 2

2

好吧,最后,像我一样固执是值得的:)

我解决了有问题的问题,而无需诉诸任何技巧。干扰我的映射的问题是 getter 返回的集合上的泛型。您会看到,orika 似乎无法处理以下映射……至少,我不知道。

public List<? extends GrantedAuthority> getAuthorities() {
    return this.role;
}

我把它改成

public List<GrantedAuthority> getAuthorities() {
    return this.role;
}

并且工作得很好!

非常感谢您的时间和关注!

于 2013-12-05T03:21:31.757 回答
1

我们的用户对象中有这样的角色(扩展了 GrantedAuthority)设置:

private Set<Role> roles = new HashSet<Role>();

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
public Collection<? extends GrantedAuthority> getAuthorities() {
    return roles;
}

请注意,它是延迟加载的,但切换到 Eager fetch 不会导致问题:

private Set<Role> roles = new HashSet<Role>();

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)
public Collection<? extends GrantedAuthority> getAuthorities() {
    return roles;
}

我对 Orika 不太熟悉,但在浏览它的文档时,您似乎可以使用一个启用 Hibernate 的实体非常简单地扩展 GrantedAuthority,这对于 Orika 来说很简单。

于 2013-12-04T04:32:10.763 回答