我正在使用Spring 4.3.8.RELEASE。我定义了以下bean ...
import org.springframework.security.core.userdetails.UserDetailsService;
...
@Service
@Transactional(readOnly = true)
public class MyUserDetailsService implements UserDetailsService
{
...
public SpringboardAuthenticationUser getSpringboardAuthenticationUser(final User domainUser)
{
...
方法“getSpringboardAuthenticationUser”是我创建的方法,不是org.springframework.security.core.userdetails.UserDetailsService接口的一部分。如何从其他地方访问此方法?例如,在我的代码的另一部分我有
@Autowired
private UserDetailsService m_myUserDetailsSvc;
但很明显,因为该方法不是UserDetailsService接口的一部分,所以我无法调用它。那么我该如何调用这个公共方法呢?
答案 0 :(得分:0)
从技术上讲,您可以将UserDetailsService
转换为MyUserDetailsService
并直接调用方法:
if (m_myUserDetailsSvc instanceof MyUserDetailsService) {
final SpringboardAuthenticationUser user = MyUserDetailsService.class.cast(m_myUserDetailsSvc).getSpringboardAuthenticationUser();
}
但从设计角度来看,我建议重新考虑它。进行依赖注入的重点是降低组件之间的耦合,这样的操作/意图迫使你做相反的事情。
为什么不让getSpringboardAuthenticationUser()
方法成为UserDetailsService
界面的一部分?在这种情况下,它将成为一个合同,并且可以确保无论DI容器注入任何实现,它都将满足合同并能够为您检索该用户。
每条评论更新
如果您的bean被代理包裹,您可以拨打isAssignableFrom
而不是instanceOf
。
if (m_myUserDetailsSvc.getClass().isAssignableFrom(MyUserDetailsService.class)) {
MyUserDetailsService.class.cast(m_myUserDetailsSvc).getSpringboardAuthenticationUser();
}
答案 1 :(得分:0)
这是一个很好的问题。如果您对UserDetailsService
的唯一实施是MyUserDetailsService
,那么请修改界面,使其包含方法getSpringboardAuthenticationUser
。
如果您无法修改界面,则可以直接自动装配您要使用的课程@Autowired MyUserDetailsService m_myUserDetailsSvc
,甚至可以将UserDetailsService
投射到MyUserDetailsService
。如果你想进行强制转换,那么我建议使用@Qualifier("MyUserDetailsService")
强制Spring注入这种类型的bean。
答案 2 :(得分:0)
- 创建一个新的界面,扩展UserDetailsService并添加所需的方法。
醇>
renderer = new THREE.WebGLRenderer({antialiasing:true});
renderer.setPixelRatio( window.devicePixelRatio * 1.5 );
- 然后实现此界面。
醇>
public class MyUserDetailsService extends UserDetailsService {
...
public SpringboardAuthenticationUser getSpringboardAuthenticationUser(final User domainUser);
...
}
- 自动装配新界面。
醇>
public class MyUserDetailsServiceImpl implements MyUserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
}
@Override
public SpringboardAuthenticationUser getSpringboardAuthenticationUser(final User domainUser){
...
//Your logic here.
}
}