sessionFactory == null

Odpowiedz Nowy wątek
2016-04-07 18:28
Wybitny Samiec
0

Witam,
Mam TaskDAOHibernate:

@Component
public class TaskDAOHibernate implements TaskDAO {
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
...

W kontrolerach mam np:

private ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    private TaskDAO taskDAO = context.getBean(TaskDAO.class);

i wszystko dziala dobrze.
Nie chcialem tworzyc nowego kontekstu z kazdym kontrolerem, wiec wymyslilem, ze zrobie @Autowired dla beanow:

public class Server {

    //@Autowired
    TaskDAO taskDAO;

W spring.xml:

 <bean id="taskDAO" class="... .TaskDAOHibernate">
        <property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory"/>
    </bean>

Spring ladnie wstrzykuje taskDAO, ale nie ustawia tam sessionFactory (jest null) i klasa Server nie moze korzystac z DAO. Co ciekawe, pozostale klasy korzystajace z DAO (te w ktorych tworze context i biore bean sam) dzialaja dobrze.

Co robie nie tak?

A czy klasa server jest też beanem? - Black007 2016-04-07 18:32

Pozostało 580 znaków

2016-04-07 18:32
Wybitny Samiec
0

Dopiero teraz zobaczylem co wyslalem: Oczywiscie @Autowired nie jest wykomentowane.

Pozostało 580 znaków

2016-04-07 18:34
0

Jeśli klasa Server nie jest beanem, to nie możesz w nim używać @Autowired bo wtedy jego cykl życia nie jest obsługiwany przez Springa.


Pozostało 580 znaków

2016-04-07 18:39
Wybitny Samiec
0

Zrobilem Server.class beanem:
W spring.xml:


<bean id="server" class="...server.Server">

    </bean>

Caly Server.class:


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class Server {

    @Autowired
    TaskDAO taskDAO;

    @Scheduled(fixedRate = 1000)
    public void tick() {
        if(taskDAO == null) {
            System.out.println("taskDAO == null");
            return;
        }
        Task running = taskDAO.getFirstRunning();
    }
}

Dalej jest to samo. taskDAO wstrzykniety ale inny niz w kontrolerach i ten nie ma ustawiony sessionFactory

Albo używaj xmla albo @Component. Spróbuj wywalić z xml ten server - Black007 2016-04-07 19:02

Pozostało 580 znaków

2016-04-07 19:08
Wybitny Samiec
0

@Black007 To samo.

Pozostało 580 znaków

2016-04-07 19:38
0

No jak tworzysz kontekst 100 razy to będziesz miał po 100 instancji tych wszystkich serwisów i sie nie dziw że inny niz w kontrolerach ;] Masz mieć JEDEN kontekst i instancjonować go tylko raz.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2016-04-07 19:49
Wybitny Samiec
0

@Shalom Rozumiem. Ciagle nie rozumiem, ze gdy biore beana przez context to ma wypelnione sessionFactory, gdy biore przez @Autowired to jest null.

Pozostało 580 znaków

2016-04-07 19:52
1

My tez nie rozumiemy. Ja głównie nie rozumiem czemu po prostu po ludzku nie podasz linka do repozytorium z tym kodem a nie liczysz że będziemy ci wróżyć z fusów...
Na oko po prostu tworzysz różne konteksty i któryś z nich w ogóle nie "zawiera" jakiegoś beana, albo wstrzykujesz przez "klasę" a nie interfejs a używasz starszej wersji Springa i nie działa bo spring nie może zrobić poprawnie dynamicznego proxy dla twojego beana. Powodów może być setka, a ja właśnie dopiłem herbatę i nie mam fusów, a szklana kula sie stłukła...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2016-04-07 20:01
Wybitny Samiec
0

Prosze, o to fusy:
https://github.com/alphatica/genotick.com
Uwaga! To moj pierwszy projekt w Spring/Hibernate.

Pozostało 580 znaków

2016-04-07 20:07
0

Że tak to ujme: WTF? o_O
To: https://github.com/alphatica/[...]src/main/resources/spring.xml powinieneś mieć w kontekście ładowanym przez kontener przy starcie spring mvc. A ty robisz tu jakieś cuda na kiju i 15 różnych plików z kontekstami w tym jeden ładowany zupełnie ręcznie "na pałe". Poza tym wywal te "zwykłe" beany z tego konktestu i zrób z nich @Named czy tam @Service po prostu a w kontekście daj component scan na te twoje pakiety.

Zaoraj to co tu uczyniłeś, sklonuj sobie https://github.com/Pharisaeus/SpringScaffoldApplication i wyjdź od tego. To nie jest całkiem idealne rozwiązanie bo mam jeden plik kontekstu dla mvc dispatchera i dla application context, ale można tak zrobić i dla małej aplikacji nie widzę sensu się bawić w milion plików.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 2x, ostatnio: Shalom, 2016-04-07 20:09

Pozostało 580 znaków

2016-04-07 20:12
Wybitny Samiec
0

@Shalom: dziekuje za pomoc, ale o zaoraniu nie ma mowy. Narazie chce miec dzialajaca funkcjonalnosc do konca, a potem przyjdzie czas na poprawki. Jest jakis powod czemu sessionFactory jest null gdy jest @Autowired?
Dzieki

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0