我正在尝试对我的 Spring 应用程序进行单元测试。 使用 Spring-Security,我无法模拟 SecurityContext 以便对我的 Controller 进行单元测试。
我发现了以下问题:Unit testing with Spring Security
我正在尝试让“社区维基”答案(此时是第二个答案)在我的网络应用程序上运行。
我主要使用注释驱动的开发然后我有以下内容:
主 Controller .java
@Controller
public class MainController {
private User currentUser;
@Autowired
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public void setCurrentUser(User currentUser) {
this.currentUser = currentUser;
}
...
}
用户工厂.java
@Component
public class UserFactory {
@Bean
public User getUserDetails() {
Authentication a = SecurityContextHolder.getContext().getAuthentication();
if (a == null) {
return null;
} else {
return (User) a.getPrincipal();
}
}
}
用户.java
public class User implements UserDetails {
private long userId;
private String username;
private String password;
private boolean enabled;
private ArrayList<GrantedAuthority> authorities;
public User() {
}
...
}
问题是 getUserDetails() 方法似乎从未被调用过,而且 UserFactory 也从未被使用过。 (我尝试了 System.out.println 并尝试了调试器)
但是没有关于 MainController 在运行时或在任何请求时没有被连接的错误。
属性 currentUser 似乎总是空的。
我也查看了这个问题,但没有找到满足我需求的东西:problem in Spring session scope bean with AOP
这是我的第一个 Spring web 应用程序,请不要苛刻。 :)
最佳答案
我注意到的第一件事是您将 @Scope
放在了错误的位置。它应该继续 @Bean
方法,而不是 @Autowired
方法,即
@Autowired
public void setCurrentUser(User currentUser) {
@Bean
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public User getUserDetails() {
令我惊讶的是 Spring 没有对此提示。
关于java - 在请求范围内使用工厂方法 Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7940219/