2016-08-14 5 views
1

私はjavafxアプリケーションとspring boot jpaを統合しました。統合が成功し、fx画面にシーンがロードされたとき、問題はサービスが@Autowired注釈付きフィールドでヌルになっていたことです。 私のプロジェクト全体をgithub boot-fxで見つけることができます。javafxサービスで統合されたSpringブートjpa null

pom details

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.3.RELEASE</version> 
    </parent> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
     </dependency> 
    </dependencies> 

Entity

@Entity 
@Table(name = "LW_BLOOD_GROUP") 
public class BloodGroup implements Serializable { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID", nullable = false, length = 11) 
    private int id; 
    @Column(name = "GROUP_NAME", nullable = false) 
    private String groupName; 
    @Column(name = "CREATED_DATE", nullable = false) 
    private Date createdDate; 
    @Column(name = "IS_DELETE", nullable = false) 
    private boolean isDelete; 

    public BloodGroup() { 
     super(); 
    } 
//getters and setters 
} 

Repository

@Repository 
public interface BloodRepository extends JpaRepository<BloodGroup, Integer>{ 
} 

serviceimpl

@Service 
public class BloodGroupServiceImpl implements BloodGroupService{ 
    @Autowired 
    private BloodRepository bloodRepository; 
    @Override 
    public Collection<BloodGroup> findAllBloodGroup() { 
     return bloodRepository.findAll(); 
    } 
} 

fx controller

@Component 
public class HomeController implements BootInitializable { 
    private ApplicationContext springContext; 
    @Autowired 
    private BloodGroupService bloodGroupService; 
    @Autowired 
    private BloodRepository bloodRepository; 

    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) {} 

    @Override 
    public void setApplicationContext(ApplicationContext arg0) throws BeansException { 
     this.springContext = springContext; 
    } 

    @Override 
    public void initConstruct() {} 

    @Override 
    public void stage(Stage primaryStage) {} 

    @Override 
    public Node initView() { 
     try { 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(getClass().getResource(Screens.HOME)); 
      //loader.setController(springContext.getBean(this.getClass())); 
      return loader.load(); 
     } catch (IOException e) { 
      System.err.println("can't load scene"); 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    @FXML 
    private void addMemberSelect(){ 
     if(bloodRepository!=null){ 
       System.out.println("service initialized"); 
      }else{ 
       System.out.println("service null"); 
      } 
    } 

} 
+1

なぜ 'loader.setController(...)'行をコメントアウトしましたか? 'loader.setController(this);'が必要なのですか? –

+0

私はfxmlページのコントローラーを既に指定しています。 – boycod3

+1

これは、コントローラクラスの新しいインスタンス(つまり、春で管理されていないインスタンス)を作成する命令です。 'fx:controller'属性を削除し、' loader.setController(this) 'を使用してください。 –

答えて

0

私のコードで問題を見つけ@James_D。 fxmlページでコントローラを指定しました。ジェームスの提案によれば、コントローラーをfxmlからfxmlコントローラーに削除しましたloader.setController(this)

関連する問題