RestController中使用@ManagedProperty注入SslService为空问题求助
问题分析与解决方法
嗨,这个问题我碰到过不少次,核心原因其实是注解的容器不兼容,咱们一步步拆解:
为什么会出现null?
@ManagedProperty是JSF(JavaServer Faces)框架专属的注入注解,它的作用范围是JSF容器管理的Bean(比如你第一个例子里的@ManagedBean)。而@RestController是Spring框架的注解,对应的Bean是由Spring IoC容器管理的——Spring根本不认识JSF的@ManagedProperty,自然不会帮你完成注入,所以你的service字段就一直是null。
解决方法
把JSF的注入方式换成Spring支持的注入注解就行,这里给你几种常用方案:
方案1:使用Spring的@Autowired(最推荐)
直接在SslService字段上添加@Autowired注解,Spring会自动匹配类型对应的Bean完成注入:
@RestController @RequestMapping("/payment") public class PaymentController { ... @Autowired SslService service; @PostConstruct public void init() { this.ssl_list = service.listSsl(); } ... }
注意:如果你的Spring版本比较新(Spring 4.3+),甚至可以不用写setter方法,直接字段注入就行。
方案2:使用@Resource指定Bean名称
如果你需要明确指定Bean的名称(和你之前@ManagedProperty("#{sslService}")的写法对应),可以用@Resource注解:
@RestController @RequestMapping("/payment") public class PaymentController { ... @Resource(name = "sslService") SslService service; @PostConstruct public void init() { this.ssl_list = service.listSsl(); } ... }
关键前提检查
别忘了确保你的SslService已经被Spring容器管理!要在SslService类上添加Spring的组件注解,比如:
@Service // 或者@Component、@Repository,根据业务场景选择 public class SslService { // 你的业务逻辑代码 }
内容的提问来源于stack exchange,提问作者Matt Vegas
相关产品推荐
相关产品推荐

