Spring @Autowired

Spring @Autowired
WY
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:134
0

Witam,

Zacząłem bawić się springiem oraz hibernate. Napisałem sobie jakąś prostą aplikację operującą na bazie danych. Wszystko było w porządku.
Spróbowałem więc połączyć to z interfejsem użytkownika przy pomocy JavyFX. Mam formatkę, gdzie posiadam dwa pola: login i hasło oraz przycisk zaloguj.

Napisałem sobie klasę UserDAO:

Kopiuj
@Repository
public class UserDAO implements IUserDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public UserDAO() {
    }

    @Override
    public void createUser(User user) {
        Session session = sessionFactory.openSession();

        try {
            session.beginTransaction();
            session.save(user);
            session.getTransaction().commit();

        } catch (RuntimeException e) {
            if(session.getTransaction() != null)
                session.getTransaction().rollback();
            e.printStackTrace();

        } finally {
            session.flush();
            session.close();
        }
    }

   // ...
}

Tutaj kontroler tego okna:

Kopiuj
@ComponentScan({"user"})
public class loginPanelController {

    private final static Logger LOGGER = Logger.getLogger(loginPanelController.class.getName());

    @FXML private TextField emailTxt;
    @FXML private PasswordField passTxt;
    @FXML private Button loginButton;
    @FXML private ImageView exitButton;

    @Autowired
    private UserDAO userService;

    @FXML
    public void LoginButtonClicked(MouseEvent mouseEvent) {
        String email = emailTxt.getText();
        String password = passTxt.getText();
        User u = null;

        try {
            u = userService.isUserExist(email, password);
        } catch (UserNotExistException e) {
            Alert alert = new Alert(Alert.AlertType.ERROR);
            alert.setTitle("Magazyn");
            alert.setHeaderText(e.getMessage());
            alert.setContentText(null);
            alert.showAndWait();
        }

        if(u != null) {
            try {

                String resource;

                if(!u.getPermissions()) {
                    resource = "/view/mainPanel/mainPanel.fxml";
                } else {
                    resource = "/view/adminPanel/adminPanel.fxml";
                }

                Stage loginStage = (Stage) Stage.getWindows().get(0);
                loginStage.close();

                FXMLLoader loader = new FXMLLoader(getClass().getResource(resource));
                Parent root = loader.load();
                mainPanelController mainPanelController = loader.getController();
                mainPanelController.setUser(u);
                mainPanelController.setUserInfoLabel();
                Stage mainStage = new Stage();
                mainStage.setScene(new Scene(root));
                mainStage.show();

            } catch (IOException e) {
                LOGGER.warning("Bład podczas tworzenia głównego okna!");
                e.printStackTrace();
            }
        }
    }

    @FXML
    public void ExitButtonClicked(MouseEvent mouseEvent) {
        System.exit(0);
    }

}

W czym jest problem: Ani w kontrolerze ani w DAO Spring nie wstrzykuje obiektów. Co może być tego przyczyną?

Pozdrawiam

PO
  • Rejestracja:prawie 10 lat
  • Ostatnio:16 dni
  • Postów:153
0
wyebani napisał(a):

Witam,

Zacząłem bawić się springiem oraz hibernate. Napisałem sobie jakąś prostą aplikację operującą na bazie danych. Wszystko było w porządku.
Spróbowałem więc połączyć to z interfejsem użytkownika przy pomocy JavyFX. Mam formatkę, gdzie posiadam dwa pola: login i hasło oraz przycisk zaloguj.

Napisałem sobie klasę UserDAO:

Kopiuj
@Repository
public class UserDAO implements IUserDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public UserDAO() {
    }

    @Override
    public void createUser(User user) {
        Session session = sessionFactory.openSession();

        try {
            session.beginTransaction();
            session.save(user);
            session.getTransaction().commit();

        } catch (RuntimeException e) {
            if(session.getTransaction() != null)
                session.getTransaction().rollback();
            e.printStackTrace();

        } finally {
            session.flush();
            session.close();
        }
    }

   // ...
}

Tutaj kontroler tego okna:

Kopiuj
@ComponentScan({"user"})
public class loginPanelController {

    private final static Logger LOGGER = Logger.getLogger(loginPanelController.class.getName());

    @FXML private TextField emailTxt;
    @FXML private PasswordField passTxt;
    @FXML private Button loginButton;
    @FXML private ImageView exitButton;

    @Autowired
    private UserDAO userService;

    @FXML
    public void LoginButtonClicked(MouseEvent mouseEvent) {
        String email = emailTxt.getText();
        String password = passTxt.getText();
        User u = null;

        try {
            u = userService.isUserExist(email, password);
        } catch (UserNotExistException e) {
            Alert alert = new Alert(Alert.AlertType.ERROR);
            alert.setTitle("Magazyn");
            alert.setHeaderText(e.getMessage());
            alert.setContentText(null);
            alert.showAndWait();
        }

        if(u != null) {
            try {

                String resource;

                if(!u.getPermissions()) {
                    resource = "/view/mainPanel/mainPanel.fxml";
                } else {
                    resource = "/view/adminPanel/adminPanel.fxml";
                }

                Stage loginStage = (Stage) Stage.getWindows().get(0);
                loginStage.close();

                FXMLLoader loader = new FXMLLoader(getClass().getResource(resource));
                Parent root = loader.load();
                mainPanelController mainPanelController = loader.getController();
                mainPanelController.setUser(u);
                mainPanelController.setUserInfoLabel();
                Stage mainStage = new Stage();
                mainStage.setScene(new Scene(root));
                mainStage.show();

            } catch (IOException e) {
                LOGGER.warning("Bład podczas tworzenia głównego okna!");
                e.printStackTrace();
            }
        }
    }

    @FXML
    public void ExitButtonClicked(MouseEvent mouseEvent) {
        System.exit(0);
    }

}

W czym jest problem: Ani w kontrolerze ani w DAO Spring nie wstrzykuje obiektów. Co może być tego przyczyną?

Pozdrawiam

  1. A jak tworzysz klase loginPanelController (swoja drogą powinna sie zaczynać z wielkiej litery) ? Pewnie gdzieś w kodzie tworzysz ją przez new loginPanelController().
  2. Podaj jak wygląda Twój config ze springa bo bez tego ciężko będzie pomóc.
  3. loginPanelController też powinien być springowym beanem żeby spring sobie tam mógł to wstrzyknąć.
WY
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:134
0

@podroznik:
Masz rację powinno być z wielkiej, mój błąd, dzięki zaraz poprawię.

Kopiuj
       Parent root = FXMLLoader.load(getClass().getResource("/view/loginPanel/loginPanel.fxml"));
       primaryStage.setScene(new Scene(root));
       primaryStage.initStyle(StageStyle.TRANSPARENT);
       primaryStage.show();
Kopiuj
spring.datasource.url=jdbc:mysql://localhost:3306/magazyn?useUnicode=yes&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.connection.characterEncoding=utf-8
spring.jpa.properties.hibernate.connection.CharSet=utf-8
spring.jpa.properties.hibernate.connection.useUnicode=true

  1. To znaczy, że powinienem nad klasą dopisać @Bean? Wtedy dostaję błędy..
PO
  • Rejestracja:prawie 10 lat
  • Ostatnio:16 dni
  • Postów:153
0

Z tego co widze korzystasz ze spring boota (popraw mnie jeśli się mylę). Proponuję poczytać dokładnie jak powinna wyglądać przykładowa konfiguracja springa bo dodawanie @ComponentScan({"user"}) nad kontrolerem pokazuje tylko, że nie masz pojęcia co robisz. Jak się domyślam to jest aplikacja desktopowa to musiałbyś dać tam @Service albo @Component i tworzyć ten controller przez springa a nie przez new (o ile tak robisz).

Zobacz pozostały 1 komentarz
WY
Meczylem się z tym z tydzień, moze dwa w końcu zrezygnowałem i ze Springa i z hibernate i pisze "klasycznie" ponieważ chcę ten projekt domknac. Ale za jakiś czas, gdy to skończę chciałbym napisać coś przy użyciu spring boota/hibernate, tylko skąd się tego uczyć?
PO
Powiem szczerze, kursy ze spring boota nie mogą być stare bo sam spring boot stary nie jest. Najlepiej z ich oficjalnej strony. Generalnie użycie springa w Twojej aplikacji która jest już stworzona wymagałaby przeorania całej apki. Bo musisz mieć klase z @SpringBootApplication i tam odpalać apke. Tutaj widze jakiś przykład dla javy fx i spring boot. https://wimdeblauwe.wordpress.com/2017/09/18/using-spring-boot-with-javafx/
WY
Mam taką klasę że @SpringBootApplication, wszystko robiłem tak jak w przypadku konsoli i intuicyjnie dodawalem do tego interfejs w JavieFX. Wszystko było wporzadku, aplikacja działa do momentu gdy dochodzę do klasy DAO, która jest nullem.. Gdy tworzę ja przez operator new, jest okej ale znowu w klasie dao mam @Autowired na SessionFactory, które jest nullem.
PO
No ale to musisz nad tym kontrolerem użyc anotacji @Service albo @Component jeśli jest tak jak mówisz to powinno zadziałać. Pamietaj, że jak masz gdzies new loginPanelController() to to nie zadziała.
WY
Nad klasą DAO mam @Service właśnie... Jak wrócę do domu to sprawdzę czy gdzieś wcześniej jej nie stworzyłem przez operator new, dzięki za podpowiedź. Powiedz mi jeszcze czy projekt pisany w spring boocie musi mieć XML z beanami lub klasę z konfiguracją? Być może tutaj jest problem, bo tego nie mam :P

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.