【发布时间】:2017-05-26 14:08:20
【问题描述】:
我有一个自动装配“Foo”服务的“Foo”控制器。
现在,当我向控制器添加 PreAuthorize 注释时,视图方法工作正常,PreAuthorize 标记仅授予具有 ADMIN 权限的用户访问权限,但 ResponseBody 方法 (getFoo) 无法按预期工作。
使用 PreAuthorize 注解时,getFoo 方法无法正确自动装配/实例化 fooService 对象,该对象的值为 null 会导致 NPE(空指针异常)。
问题概述: 当 AJAX GET 请求调用 getFoo 方法时,fooService 为 null(导致 NPE)。
但是,当注释掉@PreAuthorize 时,调用getFoo 时fooService 不再为null。
...
代码如下:
Foo 控制器
@Controller
@RequestMapping("/foo")
@PreAuthorize("hasAuthority(T(com.foo.security.Authorities).ADMIN)")
public class FooController {
@Autowired
private FooService fooService;
@RequestMapping(value = "/view")
public String view(@AuthenticationPrincipal Principal principal) {
return "view";
}
@RequestMapping(value = "/getFoo")
@ResponseBody
public Foo getFoo() {
fooService.getFoo(); <- NPE happens here
}
}
美食服务
@Service("fooService")
public class FooServiceImpl implements FooService {
@Autowired
FooRepository fooDao;
@Override
public Foo getFoo() {
return fooDao.getFoo();
}
}
安全配置
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter { ... }
【问题讨论】:
-
我也面临同样的问题。你最后能解决问题吗?
-
控制器方法之一可能是私有的
-
我怀疑这是您拥有的确切代码。我怀疑实际方法
getFoo是private而不是public或者甚至所有方法都是private而不是public。
标签: java spring spring-mvc spring-security