[RESOLVIDO] Error ao integerar wicket+spring+jpa

8 respostas
Jedi_FeniX

Estou fazendo uma aplicação que faz algumas operações de CRUD simples.
Quando tento inserir algo no banco recebo um NullPointerException.

Error:
java.lang.NullPointerException
     at br.com.teste.manager.message.view.application.FormApplicationPanel$FormApplication.createApplication(FormApplicationPanel.java:51)
     at br.com.teste.manager.message.view.application.FormApplicationPanel$FormApplication.onSubmit(FormApplicationPanel.java:93)
     at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1452)
     at org.apache.wicket.markup.html.form.Form.process(Form.java:908)
     at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:873)
     at java.lang.reflect.Method.invoke(Method.java:597)
     at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182)
     at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73)
     at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91)
     at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1188)
     at org.apache.wicket.RequestCycle.step(RequestCycle.java:1265)
     at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1366)
     at org.apache.wicket.RequestCycle.request(RequestCycle.java:498)
     at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:444)
     at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:282)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
     at java.lang.Thread.run(Thread.java:619)

Complete stack:

org.apache.wicket.WicketRuntimeException: Method onFormSubmitted of interface org.apache.wicket.markup.html.form.IFormSubmitListener targeted at component [MarkupContainer [Component id = formApplication]] threw an exception
     at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:193)
     at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73)
     at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91)
     at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1188)
     at org.apache.wicket.RequestCycle.step(RequestCycle.java:1265)
     at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1366)
     at org.apache.wicket.RequestCycle.request(RequestCycle.java:498)
     at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:444)

java.lang.reflect.InvocationTargetException
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
     at java.lang.reflect.Method.invoke(Method.java:597)
     at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182)
     at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73)
     at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91)
     at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1188)
     at org.apache.wicket.RequestCycle.step(RequestCycle.java:1265)
     at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1366)
     at org.apache.wicket.RequestCycle.request(RequestCycle.java:498)
     at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:444)
A minha classe aonde tem o meu bean é esta:
public final class FormApplicationPanel extends Panel {

    @SpringBean
    private ApplicationDAO dao;
    
    private final Application application;

    public FormApplicationPanel(final String id, final Application application) {
        super(id);
        this.application = application;
        this.add(new FormApplication());
    }

    public ApplicationDAO getDao() {
        return dao;
    }

    public void setDao(ApplicationDAO dao) {
        this.dao = dao;
    }
    
    private final class FormApplication extends Form<Application> {

        .... 

        protected void createApplication() {
            dao.create(application);
        }

        protected void editApplication() {
            getDao().edit(application);
        }

        ...

        public FormApplication() {
            super("formApplication");
            this.setOptionSelected();
            this.add(new TextField("name", new PropertyModel(application, "name")));
            this.add(new TextArea("description", new PropertyModel(application, "description")));
            this.add(new DropDownChoice("status", new PropertyModel(this, "optionSelected"), this.loadOptions(), ChoiceRenderFactory.getChoiceRender()));
        }

        @Override
        protected void onSubmit() {
            super.onSubmit();
            if (application.getId() != null) {
                this.editApplication();
            } else {
                this.createApplication();
            }
            this.setResponsePage(ListApplications.class);
        }
    }
}
A minha DAO está assim:
@Repository
public class ApplicationDAO  {

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void create(Application application) {
        this.getEntityManager().persist(application);
    }

    @Transactional
    public void edit(Application application) {
        this.getEntityManager().merge(application);
    }

    @Transactional
    public Collection<Application> findAll() {
        Collection<Application> collection = null;

        return collection;
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
}
o xml do spring está assim:
<bean name="applicationDAO" class="br.com.teste.manager.message.model.ApplicationDAO" />
        <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
        <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
        <bean name="WicketApplication" class="br.com.teste.manager.message.view.ManagerMessageApplication" />

        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="loadTimeWeaver">
                <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
            </property>
        </bean>

        <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" />

A princípio não vejo nada de errado. Desde já agradeço a ajuda.

8 Respostas

rubensdemelo

Já fez uma classe de teste, para verificar se o seu bean que está lá no spring, está sendo retornado? Tive um problemão assim tbm…

ai quando fui ver, quando eu tentava dar o getBean, para buscar o atributo no xml do spring, estava retornando null.

Jedi_FeniX

Fiz um teste com uma Servlet, como você sugeriu, e vi que o spring não estava conseguindo instanciar o EntityManager, por erro de configuração do persistence.xml.
Ai rodei a Servlet novamente e tudo funcionou, fiz um getBean e o objeto foi retornado.
Teria mais alguma sugestão? Porque ainda continuo tento o mesmo erro.

rubensdemelo

O stacktrace é o mesmo? Se não for, posta ele novamente.

Jedi_FeniX

É o mesmo…

Abaixo segue o erro novamente:

org.apache.wicket.WicketRuntimeException: Method onFormSubmitted of interface org.apache.wicket.markup.html.form.IFormSubmitListener targeted at component [MarkupContainer [Component id = formApplication]] threw an exception
        at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:193)
        at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73)
        at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91)
        at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1188)
        at org.apache.wicket.RequestCycle.step(RequestCycle.java:1265)
        at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1366)
        at org.apache.wicket.RequestCycle.request(RequestCycle.java:498)
        at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:444)
        at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:282)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182)
        ... 20 more
Caused by: java.lang.NullPointerException
        at br.com.teste.manager.message.view.application.FormApplicationPanel$FormApplication.createApplication(FormApplicationPanel.java:51)
        at br.com.teste.manager.message.view.application.FormApplicationPanel$FormApplication.onSubmit(FormApplicationPanel.java:93)
        at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1452)
        at org.apache.wicket.markup.html.form.Form.process(Form.java:908)
        at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:873)
        ... 25 more
Jedi_FeniX

Achei o erro, tinha esquecido de adicionar o listener do spring na minha aplicação wicket.
Valeu pela ajuda!

rubensdemelo

Beleza :wink:

carol_programadora

Oi, de jar é o import dessa anotação? @SpringBean?

Baixei as versões 2.5 e 3.0 e adicionei todos os jars do spring e não existe essa anotação disponível, queria usar algo assim invés de ficar declarando no xml, poderia me dizer ?

rubensdemelo

carol_programadora:
Oi, de jar é o import dessa anotação? @SpringBean?

Baixei as versões 2.5 e 3.0 e adicionei todos os jars do spring e não existe essa anotação disponível, queria usar algo assim invés de ficar declarando no xml, poderia me dizer ?

Acho que é o spring-annot.

Criado 13 de agosto de 2009
Ultima resposta 30 de nov. de 2009
Respostas 8
Participantes 3