JSF2: внедрить служебные объекты в управляемый бин из Spring?

Я тестировал это, пытаясь внедрить объект службы в @ManagedBean, но это не удалось с исключением nullpointerexception, поскольку userService имеет значение null.

В настоящее время я использую Tomcat 7, JSF 2, и вот некоторые из моих pom.xml


    1.6
    3.0.3.RELEASE
    3.6.0.Final
    ....

Вот трассировка исключения:

javax.faces.el.EvaluationException: java.lang.NullPointerException
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:636)
Caused by: java.lang.NullPointerException
    at org.albertkam.ui.LoginBean.login(LoginBean.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
    ... 23 more

Вот мой ManagedBean:

@ManagedBean
@RequestScoped
public class LoginBean {
    private MstUser entityMstUser;

    @Autowired
    private UserService userService;

    @PostConstruct
    private void init() {
        this.entityMstUser = new MstUser();
    }

А вот мой служебный компонент ..

@Service
public class UserService {

    @Autowired
    private UserDAO userDao;

    public void login(MstUser entityMstUser) {

И вот мой applicationContext.xml ..




    
    
    


И мой web.xml




    albert simpleWebapp

    
        contextConfigLocation
        
            /WEB-INF/applicationContext.xml
            /WEB-INF/datasourceContext.xml
        
    

    
        org.springframework.web.context.ContextLoaderListener
    

    
        facesServlet
        javax.faces.webapp.FacesServlet
    
    
        facesServlet
        /faces/*
    
    
        faces/index.xhtml
    
    
        javax.faces.PROJECT_STAGE
        Development
    


И мой faces-config.xml, хотя на самом деле здесь нет ничего, связанного с этим ..





    
        
            in
            en
        
      
         org.albertkam.common.messages
         msgs
      
      
         org.albertkam.common.errors
         errs
      

      
    

    
        org.albertkam.common.BusinessExceptionHandlerFactory
    

Интересно, это ' внедрение управляемого bean-компонента Spring в @ManagedBean?

Поделитесь своим опытом в этом ..

Спасибо!

*********** добавил несколько новых результатов эксперимента **** ************

Только что я попытался использовать @Named для замены @ManagedBean и @Inject для замены @Autowired, и это сработало, хотя я до сих пор не понимаю, почему.

Итак, вот модифицированный управляемый компонент:

@Named("userBean")
@RequestScoped
public class LoginBean {
    private MstUser entityMstUser;

    @Inject
    private UserService userService;

    @PostConstruct
    private void init() {
        this.entityMstUser = new MstUser();
    }

Это работает, объект службы был внедрен, хотя userService управляется Spring? Как это возможно?

Вот еще кое-что, что я добавляю по ходу дела ..

Я добавил это в web.xml


    org.springframework.web.context.request.RequestContextListener


    org.jboss.weld.environment.servlet.Listener

Я также добавил пустой WEB-INF / beans.xml

И это внутри faces-config.xml

*********** добавил несколько новых результатов эксперимента ****************

Только что я попытался использовать @Named для замены @ManagedBean и @Inject для замены @Autowired, и это сработало, хотя я до сих пор не понимаю, почему.

Итак, вот модифицированный управляемый компонент:

@Named("userBean")
@RequestScoped
public class LoginBean {
    private MstUser entityMstUser;

    @Inject
    private UserService userService;

    @PostConstruct
    private void init() {
        this.entityMstUser = new MstUser();
    }

Это работает, объект службы был внедрен, хотя userService управляется Spring ? Как это возможно?

Вот еще кое-что, что я добавляю по ходу дела ..

Я добавил это в web.xml


    org.springframework.web.context.request.RequestContextListener


    org.jboss.weld.environment.servlet.Listener

Я также добавил пустой WEB-INF / beans.xml

И это внутри faces-config.xml

*********** добавил несколько новых результатов эксперимента ****************

Только что я попытался использовать @Named для замены @ManagedBean и @Inject для замены @Autowired, и это сработало, хотя я до сих пор не понимаю, почему.

Итак, вот модифицированный управляемый компонент:

@Named("userBean")
@RequestScoped
public class LoginBean {
    private MstUser entityMstUser;

    @Inject
    private UserService userService;

    @PostConstruct
    private void init() {
        this.entityMstUser = new MstUser();
    }

Это работает, объект службы был внедрен, хотя userService управляется Spring ? Как это возможно?

Вот еще кое-что, что я добавляю по ходу дела ..

Я добавил это в web.xml


    org.springframework.web.context.request.RequestContextListener


    org.jboss.weld.environment.servlet.Listener

Я также добавил пустой WEB-INF / beans.xml

И это внутри faces-config.xml хотя userService управляется Spring? Как это возможно?

Вот некоторые дополнительные вещи, которые я добавляю по ходу дела ..

Я добавил это в web.xml


    org.springframework.web.context.request.RequestContextListener


    org.jboss.weld.environment.servlet.Listener

Я также добавил пустой WEB-INF / beans.xml

И это внутри faces-config.xml хотя userService управляется Spring? Как это возможно?

Вот еще кое-что, что я добавляю по ходу дела ..

Я добавил это в web.xml


    org.springframework.web.context.request.RequestContextListener


    org.jboss.weld.environment.servlet.Listener

Я также добавил пустой WEB-INF / beans.xml

И это внутри faces-config.xml org.springframework.web.jsf.el.SpringBeanFacesELResolver

Меня немного беспокоит использование @Named, потому что у меня был неудачный опыт его использования вместе с ViewScoped. Я бы чувствовал себя намного безопаснее, когда у меня есть возможность внедрить в @ManagedBean объекты службы с помощью инфраструктуры Spring.

Интересно, что вы, ребята, обычно делаете, чтобы соединить ManagedBean с объектами бизнес-служб ... с помощью CDI или чисто Весна или их сочетание?

7
задан Community 23 May 2017 в 12:11
поделиться