@Value不在扩展其他类的类中工作

时间:2014-11-21 21:39:57

标签: java spring spring-mvc

是否可以在扩展另一个类的类中使用@Value

以下是相关的代码段。在Lo_Controller类中,它可以完美地运行,但在Lo_DisplayHandler中始终返回null。我能想到的唯一原因是因为它依赖于另一个没有用@Component注释的类。如果这是原因,那么从类似于@Value的属性文件中读取值的建议选项是什么?

为了测试它,我在@Component中从@Controller更改为Lo_DisplayHandler,看看,如果它们彼此之间有某种关联,则会返回null好。

这有效:

package com.ma.common.controller;
imports ...

@Controller
@RequestMapping("/log")
public class Lo_Controller {
       @Value("${log.display.lastpage}")
       private String lastPageUrl;
...

这总是返回null

package com.ma.log.handler;
imports ...
@Component
public class Lo_DisplayHandler extends Lo_Handler {
       public Lo_DisplayHandler() {
              super();
       }
       @Value("${log.display.lastpage}")
       private String lastPageUrl;
... 

MVC-调度-servlet.xml中

<context:component-scan base-package="com.ma.common.controller, com.ma.log.handler" />
<context:property-placeholder location="classpath:restServices.properties"/>

<mvc:annotation-driven />
<mvc:resources mapping="/**" location="/" />


@Component
public class Lo_DisplayHandler extends Lo_Handler {

       @Value("${log.display.lastpage}")
       private String lastPageUrl;

       public void anyOtherMethod(){
              String _a = lastPageUrl; //FAIL - always null
       }

       @PostConstruct
       public void initIt() throws Exception {
              String _a = lastPageUrl; //OK - when the application is deployed and started for the first time
       }

       @PreDestroy
       public void cleanUp() throws Exception {
              String _a = lastPageUrl; //OK - when the application is stopped
       }

web.xml

       <servlet>
              <servlet-name>mvc-dispatcher</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <load-on-startup>1</load-on-startup>
       </servlet>

       <servlet-mapping>
              <servlet-name>mvc-dispatcher</servlet-name>
              <url-pattern>/</url-pattern>
       </servlet-mapping>

       <context-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
       </context-param>

       <listener>
              <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
       </listener>

1 个答案:

答案 0 :(得分:0)

这里有三个可能的问题:

首先,我不鼓励扩展类,因为Spring可以更好地自动连接依赖项。但它应该工作 其次,您必须关注bean的生命周期。该物业将在实施后设定。 @PostConstruct验证内容。 第三,财产持有人的等级背景下的可见性不是直截了当的。因此,如果您在根applicationContext中定义@value,则它不会由您的dispatcherServlet上下文设置。要测试它,请注入在根级别定义的bean的依赖关系,您将看到您的@Value将被考虑在内。

可以从同一上下文中的bean访问lastPageUrl属性(通过push创建或pull创建)。 在创建push的情况下,如果另一个bean自动装入Lo_DisplayHandler bean并调用你的方法anyOtherMethod(),它将获得该值。

@Component
public class ScannableIntoYourContext{

    @Autowired
    private Lo_DisplayHandler myHandler;

}

其他方法是从ObjectFactory中提取bean。

@Autowired
private ObjectFactory<Lo_DisplayHandler> bean;

Lo_DisplayHandler instanceFromContext = bean.getObject();