получение нулевого значения при использовании внедрения @Value в класс, аннотированный @Service, но способный получить значения в классе, аннотированный @Controller - PullRequest
0 голосов
/ 26 мая 2018

Я получаю нулевое значение, когда пытаюсь внедрить его с помощью инъекции @Value в классы, аннотированные @Service Class, но я могу получить значения для тех же свойств в классе, аннотированном @Service. Я использую Spring 4.2 vesion

web.xml выглядит следующим образом :::

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name></display-name>



<servlet>
    <servlet-name>CaptchaServlet</servlet-name>
    <servlet-class>com.cdac.sikkimSprings.servlets.CaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CaptchaServlet</servlet-name>
    <url-pattern>/captcha.jpg</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>SpringController</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>SpringController</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/beans.xml
        /WEB-INF/spring-security.xml
    </param-value>
</context-param>
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

springMVC.xml выглядит следующим образом

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="com.basePackage" />
    <mvc:annotation-driven />

    <mvc:resources mapping="/resources/**" location="/resources/" />
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <context:property-placeholder location="classpath:properties/development.properties" order="1"/>

    <bean id="multipartResolver"   
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

</beans>        

у меня также есть beans.xml для определений бинов, который выглядит следующим образом

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
        <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property 
        name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" 
        value="root" /> <property name="password" value="password" /> </bean> -->

// Упомянутое ниже определение компонента - это тот же класс, где мне нужно ввести значения свойств, которые аннотируются @Service annotation

    <bean id="userManagement"
            class="com.basepackage.userManagement">

    </bean>



</beans>

Ниже приведен фактический класс Java, где значениянеобходимо ввести

@Service("userManagementService")
@Transactional
public class userManagement implements RetrieveUserListService{

    //This value is not getting injected
    @Value("${registrationstatus_registered}")
    String statusRegistered;


    @Value("${registrationstatus_pending}")
    String statusPending;


    @Override
    public List<ShowUserListPOJO> RetrieveUserList(HttpServletRequest request, HttpServletResponse response) {
        // TODO Auto-generated method stub

        //here the required value is null
        System.out.println(statusRegistered);



        return null;
    }
    //Code bellow is skipped...

Те же значения, которые я добавляю в класс ниже, здесь вводятся правильно

@Controller
public class UserManagement {

    @Value( "${registrationstatus_registered}" )
    String registrationstatus;



    @RequestMapping(value="/userManagement", method = RequestMethod.GET)
    public void userManagement(HttpServletRequest request,HttpServletResponse response) {

        //here value is prnted properly
        System.out.println(registrationstatus);


       //......Code below skipped
}

development.properties как указано ниже

registrationstatus_registered = registered
registrationstatus_pending = pending

1 Ответ

0 голосов
/ 27 мая 2018

В вашем приложении есть два контекста пружины: контекст корневого приложения (ContextLoaderListener) и контекст веб-приложения (DispatcherServlet).Вы должны понимать разницу между ними.Читайте здесь .Если вы переместите определение ресурса своего свойства в beans.xml (который используется для корневого контекста), значение вашего свойства будет корректно введено во всем приложении.

переместите это различие bean-компонента в beans.xml <context:property-placeholder location="classpath:properties/development.properties" order="1"/>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...