2014-03-03 2 views
0

JavaFX 독립 실행 형 응용 프로그램에서 @Service 클래스를 JavaFX 컨트롤러 (@Component 주석이있는)에 @Autowired하면 null 값을 가져옵니다. 내 코드는 아래와 같습니다. 어떤 사람이 나를 도울 수 있습니다. 고마워.Spring @Autowired가 @Component 클래스와 함께 작동합니다.

다오 클래스

package com.core.repository; 

public interface DeviceDao extends PagingAndSortingRepository<Device, Integer>, JpaSpecificationExecutor<Device> { 

    Device findById(Integer id); 

    Device findByName(String name); 

    List<Device> findAll(); 
} 

서비스 클래스 @Component 어노테이션

package com.core.service.impl; 

@Service("deviceService") 
public class DeviceServiceImpl implements DeviceService { 

    @Autowired 
    private DeviceDao deviceDao; 

    public List<Device> selectAll() { 
     return deviceDao.findAll(); 
    } 
} 

자바 FX 컨트롤러

package com.stportal.ui.contoller; 

@Component 
public class HomeController implements Initializable { 

    @Autowired 
    private DeviceService deviceService; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

     // This condition will not execute due to service was null 
     if(deviceService != null) { 
      System.out.println("Not Null"); 
     } 
    } 
} 

응용 프로그램의 context.xml

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

    <context:component-scan base-package="com" /> 
    <context:annotation-config/> 

    <bean id="entityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" /> 
     <property name="packagesToScan" value="com.core.domain" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> 
       <!--dialect for MySQL Server--> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <!--<prop key="hibernate.hbm2ddl.auto">create</prop>--> 
       <prop key="hibernate.show_sql">false</prop> 
       <prop key="hibernate.format_sql">false</prop> 
       <prop key="hibernate.use_sql_comments">false</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="hibernateJpaVendorAdapter" 
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    </bean> 

    <jpa:repositories base-package="com" 
         transaction-manager-ref="transactionManager" 
         entity-manager-factory-ref="entityManagerFactory" /> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 


    <tx:annotation-driven transaction-manager="transactionManager" 
          proxy-target-class="true" /> 

    <context:property-placeholder 
      ignore-resource-not-found="true" location="classpath*:/project.properties" /> 

    <!-- DataSource Related Configurations --> 
    <beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <!--configuration pool via c3p0--> 
     <beans:property name="driverClass" value="${jdbc.driver}"/> 
     <beans:property name="jdbcUrl" value="${jdbc.url}"/> 
     <beans:property name="user" value="${jdbc.username}"/> 
     <beans:property name="password" value="${jdbc.password}"/> 
     <beans:property name="description" value="integration_ds"/> 
     <!--seconds --> 
     <beans:property name="acquireIncrement" value="${datasource.acquireIncrement}"/> 
     <beans:property name="idleConnectionTestPeriod" value="${datasource.idleConnectionTestPeriod}"/> 
     <!--configuration pool via c3p0--> 
     <beans:property name="maxPoolSize" value="${datasource.maxPoolSize}"/> 
     <beans:property name="maxStatements" value="${datasource.maxStatements}"/> 
     <beans:property name="minPoolSize" value="${datasource.minPoolSize}"/> 
     <beans:property name="initialPoolSize" value="${datasource.initialPoolSize}"/> 
     <beans:property name="maxIdleTime" value="${datasource.maxIdleTime}"/> 
     <beans:property name="acquireRetryAttempts" value="${datasource.acquireRetryAttempts}"/> 
     <beans:property name="acquireRetryDelay" value="${datasource.acquireRetryDelay}"/> 
     <beans:property name="breakAfterAcquireFailure" value="${datasource.breakAfterAcquireFailure}"/> 
    </beans:bean> 

</beans> 

메이븐 pom.xml 파일

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <!-- Configure module specific parameters --> 
    <groupId>com</groupId> 
    <artifactId>IDEW</artifactId> 
    <version>1.0</version> 
    <packaging>jar</packaging> 
    <name>IDEW</name> 
    <url>http://maven.apache.org</url> 

    <!-- Configure dependency specific properties --> 
    <properties> 
     <java-version>1.7</java-version> 
     <org.springframework-version>4.0.2.RELEASE</org.springframework-version> 

     <spring.version>4.0.2.RELEASE</spring.version> 
     <hibernate.version>4.3.1.Final</hibernate.version> 
     <aspectj.version>1.7.3</aspectj.version> 
     <spring-data-jpa.version>1.4.2.RELEASE</spring-data-jpa.version> 
     <hibernate-validator.version>5.0.2.Final</hibernate-validator.version> 
     <slf4j.version>1.7.5</slf4j.version> 
     <logback.version>1.1.0</logback.version> 
     <commons-lang3.version>3.2.1</commons-lang3.version> 
     <commons-io.version>2.4</commons-io.version> 
     <junit.version>4.11</junit.version>    
     <ehcache.version>2.6.8</ehcache.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 

    </properties> 

    <!-- Configure all dependencies --> 
    <dependencies> 

     <!-- JavaFX --> 
     <dependency> 
      <groupId>com.oracle</groupId> 
      <artifactId>javafx</artifactId> 
      <version>2.2</version> 
      <scope>system</scope> 
      <systemPath>${java.home}/lib/jfxrt.jar</systemPath> 
     </dependency> 

     <!-- Spring --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <!-- CGLIB (required for Spring annotation configuration) --> 
     <dependency> 
      <groupId>cglib</groupId> 
      <artifactId>cglib</artifactId> 
      <version>2.2</version> 
     </dependency> 

     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>${aspectj.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjweaver</artifactId> 
      <version>${aspectj.version}</version> 
      <scope>runtime</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>${spring.version}</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>${slf4j.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>${logback.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>log4j-over-slf4j</artifactId> 
      <version>${slf4j.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>jcl-over-slf4j</artifactId> 
      <version>${slf4j.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>jul-to-slf4j</artifactId> 
      <version>${slf4j.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-jpa</artifactId> 
      <version>${spring-data-jpa.version}</version> 
      <exclusions> 
       <exclusion> 
        <groupId>junit</groupId> 
        <artifactId>junit-dep</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>${spring.version}</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>${hibernate.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>${hibernate.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>${junit.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-c3p0</artifactId> 
      <version>4.3.1.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.29</version> 
     </dependency> 

    </dependencies> 

    <!-- Build specific configurations --> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>${java-version}</source> 
        <target>${java-version}</target> 
        <fork>true</fork> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>exec-maven-plugin</artifactId> 
       <configuration> 
        <classpathScope>compile</classpathScope> 
        <mainClass>com.stportal.app.MainApplication</mainClass> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

</project> 
+0

JavaFX 컨트롤러는 JavaFX가 제어하는 ​​스프링 관리 빈이 아닙니다. 기본적으로 Spring에 의해 생성/감지 된 bean은 JavaFX가 새로운 인스턴스를 생성 할 때 쓸모가 없다. 이것은 스프링에 의해 주입되지 않을 것이다. –

+0

@ M.Deinum 전액 피드백에 많은 감사드립니다. 어떤 아이디어가 있다면 지금 제게이 문제를 해결하기 위해이 코드를 리팩터링하려고합니다. 감사. – Channa

+0

[내 Spring @Autowired 필드가 null 인 이유는 무엇입니까?] (http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null) – chrylis

답변

3

내가 봄에 대해 조금 알고 있지만 공원 Serneels이 Spring and JavaFX integration에 좋은 블로그를 썼다. Spring에서 의존성 주입을 JavaFX 컨트롤러와 함께 작동시키는 데 필요한 핵심 요소는 FXMLLoader의 set a controller factory입니다.

다음은 Java 8 구문을 사용하여 관련 로딩 코드를 간단하게 보여줍니다 (스프링을 사용하지 않았으므로 테스트하지 않았습니다. 작동하지 않으면 게시물을 편집하고 수정할 수 있음).).

import java.io.*; 
import javafx.fxml.FXMLLoader; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 

public class SpringFxmlLoader { 
    private static final ApplicationContext applicationContext = 
      new AnnotationConfigApplicationContext(
        SpringApplicationConfig.class 
      ); 

    public Object load(String url) throws IOException { 
     FXMLLoader loader = new FXMLLoader(); 

     loader.setControllerFactory(
       (clazz) -> applicationContext.getBean(clazz) 
     ); 

     return loader.load(
       SpringFxmlLoader.class.getResourceAsStream(url) 
     ); 
    } 
} 
+0

귀중한 의견을 보내 주셔서 감사합니다. 확실히 그 문제를보고 문제를 해결하려고 노력할 것입니다. 감사. – Channa

0

심지어 @Autowired가 아니어도 응용 프로그램 컨텍스트에서 해당 서비스 양식을 얻으면 좋았습니다.

@Component 
    public class HomeController implements Initializable { 

     private DeviceService deviceService; 

     @Override 
     public void initialize(URL url, ResourceBundle rb) { 

      deviceService = AppUtil.appContext.getBean(DeviceService.class); 

      // Now this condition is execute due to service was NOT null 
      if(deviceService != null) { 
      System.out.println("Not Null"); 
      }   
     }  
    } 
관련 문제