springboot&x2B;冬眠+;javaFX

springboot&x2B;冬眠+;javaFX,java,hibernate,spring-boot,Java,Hibernate,Spring Boot,我被困在这里面好几天,一事无成。 下面是交易..我正在构建一个应用程序,它使用springboot(主要是使用crudeRepository)和javafx和hibernate 但我一直在犯这样的错误: Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at javafx.fxml.FXMLLoader$Me

我被困在这里面好几天,一事无成。 下面是交易..我正在构建一个应用程序,它使用springboot(主要是使用crudeRepository)和javafx和hibernate

但我一直在犯这样的错误:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8413)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.Trampoline.invoke(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 52 more
Caused by: java.lang.NullPointerException
    at br.jus.trt9.PjeMonitor.view.MonitorPjeController.mouseEvent(MonitorPjeController.java:153)
    ... 62 more
发生这种情况是因为crudepository clientRepo为null,不知道为什么…在正常执行中,它应该有如下内容:

org.springframework.data.jpa.repository.support。SimpleJpaRepository@5a0a3243

任何人,知道为什么吗?先谢谢你

ClientRepo.java 进口

/*TODO essa classe deve implementar o CrudRepository
que vem do spring-DATA-core
*/
@Repository
public interface ClientRepo extends CrudRepository<Client, Integer> {

}
@SpringBootApplication
public class App extends AbstractJavaFxApplicationSupport {

    /**
     * Note that this is configured in application.properties
     */
    @Value("${app.ui.title:PJe Midia Monitor}")//
    private String windowTitle;



    public static void main(String[] args) {

        launchApp(App.class, VisaoView.class, args);
    }

}

你想要达到的目标并不像看上去那么容易

你可以开始阅读,或者从那里继续前进

事实上,结合javafx和Spring+Hibernate有几个问题

最大的问题是范围

Spring和Hibernate大部分都是在web应用程序中开发的,web应用程序具有一些定义良好的范围(应用程序、会话、请求)

JavaFX没有固有的作用域,您必须创建自定义作用域并对其进行管理

还有一个非常重要的细节,Spring和JafaFX FXMLLoader都应该在同一个对象(控制器)中注入字段

最后但并非最不重要的是管理和确定Hibernate会话范围的问题

这是一个很大的工作,我知道这一点,因为我用WELD+JavaFX做了一些非常类似的事情。

我终于做到了! 根据@jewelsea给出的提示,我研究了由创建的框架。这需要对代码进行一点重构,主要是在控制器部分

App.java 进口

/*TODO essa classe deve implementar o CrudRepository
que vem do spring-DATA-core
*/
@Repository
public interface ClientRepo extends CrudRepository<Client, Integer> {

}
@SpringBootApplication
public class App extends AbstractJavaFxApplicationSupport {

    /**
     * Note that this is configured in application.properties
     */
    @Value("${app.ui.title:PJe Midia Monitor}")//
    private String windowTitle;



    public static void main(String[] args) {

        launchApp(App.class, VisaoView.class, args);
    }

}
2-视图类

imports ....


@FXMLView(value = "view/visao.fxml")
public class VisaoView extends AbstractFxmlView {

}
3-控制器

imports ....

@FXMLController
public class MonitorPjeController {

    @FXML
    private TableView<Audiencia> audTable;

    @FXML
    private TableColumn<Audiencia, String> audId;

    @FXML
    private TableColumn<Audiencia, LocalDate> dataId;

    @FXML
    private TableColumn<Audiencia, String> assId;

    @FXML
    private ComboBox<Client> clientcomboBox;

    @FXML
    private Button BtnListaId = new Button();

    @FXML
    private Button BtnListarMaq;

    @FXML
    private ObservableList<Client> myClientComboBoxData = FXCollections.observableArrayList();

    @FXML
    private ObservableList<Audiencia> audData = FXCollections.observableArrayList();

    @Autowired
    private ClienteRepo clienteRepo;

    @FXML
    private void initialize() {

        populaTabela();

        Client client = new Client("teste123", "21 vt");

        // sets the combobox options
        myClientComboBoxData.add(client);
        myClientComboBoxData.add(new Client("cta122223", "10 vt"));
        myClientComboBoxData.add(new Client("cta122223", "17 vt"));
        myClientComboBoxData.add(new Client("cta120337", "18 vt"));

        clientcomboBox.setItems(myClientComboBoxData);

        clientcomboBox.setCellFactory((comboBox) -> {
            return new ListCell<Client>() {
                @Override
                protected void updateItem(Client item, boolean empty) {
                    super.updateItem(item, empty);

                    if (item == null || empty) {
                        setText(null);
                    } else {
                        setText(item.getVara());
                    }
                }
            };
        });

        clientcomboBox.setConverter(new StringConverter<Client>() {

            @Override
            public String toString(Client maquina) {
                if (maquina == null) {
                    return null;
                } else {
                    return maquina.getVara();
                }
            }

            @Override
            public Client fromString(String string) {
                // TODO Auto-generated method stub
                return null;
            }
        });

    }


    public void populaTabela() {
        audData.add(new Audiencia("12123123213213", LocalDate.now(), "sim"));
        audData.add(new Audiencia("22222222222222", LocalDate.now(), "nao"));
        audData.add(new Audiencia("22222222222222", LocalDate.now(), "nao"));
        audData.add(new Audiencia("55555555555555", LocalDate.now(), "sim"));
        audData.add(new Audiencia("6666666666666", LocalDate.now(), "nao"));
        audData.add(new Audiencia("7777777777777", LocalDate.now(), "nao"));
        audData.add(new Audiencia("8888888888888", LocalDate.now(), "sim"));
        audData.add(new Audiencia("99999999999999", LocalDate.now(), "nao"));
        audData.add(new Audiencia("100010110101001", LocalDate.now(), "nao"));


        audTable.setItems(getAudData());

        audId.setCellValueFactory(cellData -> cellData.getValue().processoProperty());
        dataId.setCellValueFactory(cellData -> cellData.getValue().dataProperty());
        assId.setCellValueFactory(cellData -> cellData.getValue().assinadoProperty());
    }

    public ObservableList<Audiencia> getAudData() {
        return audData;
    }

    public void setAudData(ObservableList<Audiencia> audData) {
        this.audData = audData;
    }

}
导入。。。。
@FXML控制器
公共类MonitorPjeController{
@FXML
私有TableView表;
@FXML
私有表列audId;
@FXML
私有表列数据标识;
@FXML
私人表格;
@FXML
私人ComboBox客户端ComboBox;
@FXML
私有按钮BtnListaId=新按钮();
@FXML
私人按钮BtnListarMaq;
@FXML
私有ObservableList MyClientComboxData=FXCollections.observableArrayList();
@FXML
私有ObservableList audData=FXCollections.observableArrayList();
@自动连线
私人ClienteRepo ClienteRepo;
@FXML
私有void初始化(){
populatbela();
客户=新客户(“teste123”、“21 vt”);
//设置组合框选项
MyClientComboxData.add(客户端);
添加(新客户端(“CTA1223”,“10VT”);
添加(新客户端(“CTA1223”,“17 vt”);
添加(新客户端(“cta120337”、“18VT”);
setItems(MyClientComboxData);
clientcomboBox.setCellFactory((comboBox)->{
返回新的ListCell(){
@凌驾
受保护的void updateItem(客户端项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
setText(空);
}否则{
setText(item.getVara());
}
}
};
});
setConverter(新的StringConverter(){
@凌驾
公共字符串toString(客户端maquina){
如果(maquina==null){
返回null;
}否则{
返回maquina.getVara();
}
}
@凌驾
公共客户端fromString(字符串){
//TODO自动生成的方法存根
返回null;
}
});
}
公共空间{
添加(新的Audienceia(“12123123213213”,LocalDate.now(),“sim”);
add(newaudenciia(“22222”,LocalDate.now(),“nao”);
add(newaudenciia(“22222”,LocalDate.now(),“nao”);
add(新的Audienceia(“555555”,LocalDate.now(),“sim”);
add(newaudenciia(“66666”,LocalDate.now(),“nao”);
add(newaudencia(“777”,LocalDate.now(),“nao”);
添加(新的AudienceIA(“88888888888”,LocalDate.now(),“sim”);
add(newaudenciia(“9999999999999”,LocalDate.now(),“nao”);
add(newaudenciia(“100010110101001”,LocalDate.now(),“nao”);
setItems(getAudData());
audId.setCellValueFactory(cellData->cellData.getValue().processoProperty());
dataId.setCellValueFactory(cellData->cellData.getValue().dataProperty());
assId.setCellValueFactory(cellData->cellData.getValue().assinadoProperty());
}
公共可观察列表getAudData(){
返回数据;
}
公共无效setAudData(可观察列表audData){
this.audData=audData;
}
}

我看不到您的Spring Boot入口点。如果我确实了解您想要什么,您的意思是
publicstaticvoidmain(String[]args){Application.launch(args);}
这是标准的JavaFX入口点,但我看不到Spring上下文开始。正如您所指出的,应用程序没有Spring入口点……所以我创建了一个(编辑了原始的PostLaunchClass.java)。但现在,应用程序运行…并退出。我在这里迷路了。lolFWIW和我从来没有试过。有一个图书馆和一个图书馆。我建议您尝试一下。先生,谢谢您的回复…我将尝试看看是否有更好的方法来实现这一点,并在稍后发布一些反馈!我解决了这个问题,我是说……某种程度上……重构了整个应用程序。移除了spring引导,并单独使用javaFX+hibernate,它可以正常工作。但是,在不久的将来,我会尝试jewelsea引用的教程。cyaGood,从基础开始总是明智的做法,然后,当你有坚实的基础来构建时,再迈出一步。正如我所说,我确实重构了项目,现在又重构了项目
imports ....

@FXMLController
public class MonitorPjeController {

    @FXML
    private TableView<Audiencia> audTable;

    @FXML
    private TableColumn<Audiencia, String> audId;

    @FXML
    private TableColumn<Audiencia, LocalDate> dataId;

    @FXML
    private TableColumn<Audiencia, String> assId;

    @FXML
    private ComboBox<Client> clientcomboBox;

    @FXML
    private Button BtnListaId = new Button();

    @FXML
    private Button BtnListarMaq;

    @FXML
    private ObservableList<Client> myClientComboBoxData = FXCollections.observableArrayList();

    @FXML
    private ObservableList<Audiencia> audData = FXCollections.observableArrayList();

    @Autowired
    private ClienteRepo clienteRepo;

    @FXML
    private void initialize() {

        populaTabela();

        Client client = new Client("teste123", "21 vt");

        // sets the combobox options
        myClientComboBoxData.add(client);
        myClientComboBoxData.add(new Client("cta122223", "10 vt"));
        myClientComboBoxData.add(new Client("cta122223", "17 vt"));
        myClientComboBoxData.add(new Client("cta120337", "18 vt"));

        clientcomboBox.setItems(myClientComboBoxData);

        clientcomboBox.setCellFactory((comboBox) -> {
            return new ListCell<Client>() {
                @Override
                protected void updateItem(Client item, boolean empty) {
                    super.updateItem(item, empty);

                    if (item == null || empty) {
                        setText(null);
                    } else {
                        setText(item.getVara());
                    }
                }
            };
        });

        clientcomboBox.setConverter(new StringConverter<Client>() {

            @Override
            public String toString(Client maquina) {
                if (maquina == null) {
                    return null;
                } else {
                    return maquina.getVara();
                }
            }

            @Override
            public Client fromString(String string) {
                // TODO Auto-generated method stub
                return null;
            }
        });

    }


    public void populaTabela() {
        audData.add(new Audiencia("12123123213213", LocalDate.now(), "sim"));
        audData.add(new Audiencia("22222222222222", LocalDate.now(), "nao"));
        audData.add(new Audiencia("22222222222222", LocalDate.now(), "nao"));
        audData.add(new Audiencia("55555555555555", LocalDate.now(), "sim"));
        audData.add(new Audiencia("6666666666666", LocalDate.now(), "nao"));
        audData.add(new Audiencia("7777777777777", LocalDate.now(), "nao"));
        audData.add(new Audiencia("8888888888888", LocalDate.now(), "sim"));
        audData.add(new Audiencia("99999999999999", LocalDate.now(), "nao"));
        audData.add(new Audiencia("100010110101001", LocalDate.now(), "nao"));


        audTable.setItems(getAudData());

        audId.setCellValueFactory(cellData -> cellData.getValue().processoProperty());
        dataId.setCellValueFactory(cellData -> cellData.getValue().dataProperty());
        assId.setCellValueFactory(cellData -> cellData.getValue().assinadoProperty());
    }

    public ObservableList<Audiencia> getAudData() {
        return audData;
    }

    public void setAudData(ObservableList<Audiencia> audData) {
        this.audData = audData;
    }

}