Предаването на параметър към метод с помощта на ‹ui.repeat› и ‹h:commandLink› хвърля NullPointerException

Използвам за итерация върху общ списък, деклариран от обект "Категория" в JSF документ. Използването на commandLink води до изключение. Когато премахна параметъра от метода (в JSF код и bean) и го оставя да направи системно съобщение, всичко е наред. Така че предполагам, че когато командата Link е натисната, вече няма стойност за "item".

<ui:repeat var="item" value="#{category.items}">
<h:form>
<h:commandLink value="add" actionListener="#{cartBean.addItem(item)}" />
</h:form>
</ui:repeat>

CartBean:

package huhu.main.managebean;

import java.io.Serializable;
import java.util.List;

import org.apache.log4j.Logger;

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import huhu.model.generated.Item;

@Named
@SessionScoped
public class CartBean implements Serializable {
   /**
    * 
    */
   private static final long serialVersionUID = 1L;
   private List<Item> cart;


   public void addItem(Item item){
      cart.add(item);
   }


   /**
    * @return the cart
    */
   public List<Item> getCart() {
      return cart;
   }
   /**
    * @param cart the cart to set
    */
   public void setCart(List<Item> cart) {
      this.cart = cart;
   }

}

Докладът:

23:21:31,833 SEVERE [javax.faces.event] (http-localhost-127.0.0.1-8080-5) Beim Aufrufen des Aktionszielgeräts 'java.lang.NullPointerException' für Komponente '#{cartBean.addItem(item)}' wurde 'j_idt40' erhalten.
23:21:31,835 SEVERE [javax.faces.event] (http-localhost-127.0.0.1-8080-5) java.lang.NullPointerException
    at huhu.main.managebean.CartBean.addItem(CartBean.java:29)
    at huhu.main.managebean.CartBean$Proxy$_$$_WeldClientProxy.addItem(CartBean$Proxy$_$$_WeldClientProxy.java)
    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 org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at com.sun.faces.facelets.component.UIRepeat.broadcast(UIRepeat.java:921)
    at com.sun.faces.facelets.component.UIRepeat.broadcast(UIRepeat.java:921)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    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:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
    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:368)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
    at java.lang.Thread.run(Unknown Source)

23:21:31,848 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-localhost-127.0.0.1-8080-5) JSF1073: javax.faces.event.AbortProcessingException erfasst während Verarbeitung von INVOKE_APPLICATION 5 : UIComponent-ClientId=j_idt26:j_idt35, Message=/menu.xhtml @172,86 actionListener="#{cartBean.addItem(item)}": java.lang.NullPointerException
23:21:31,850 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-localhost-127.0.0.1-8080-5) /menu.xhtml @172,86 actionListener="#{cartBean.addItem(item)}": java.lang.NullPointerException: javax.faces.event.AbortProcessingException: /menu.xhtml @172,86 actionListener="#{cartBean.addItem(item)}": java.lang.NullPointerException
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at javax.faces.component.UICommand.broadcast(UICommand.java:300) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at com.sun.faces.facelets.component.UIRepeat.broadcast(UIRepeat.java:921) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.facelets.component.UIRepeat.broadcast(UIRepeat.java:921) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
    at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_07]
Caused by: java.lang.NullPointerException
    at huhu.main.managebean.CartBean.addItem(CartBean.java:29) [classes:]
    at huhu.main.managebean.CartBean$Proxy$_$$_WeldClientProxy.addItem(CartBean$Proxy$_$$_WeldClientProxy.java) [classes:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_07]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_07]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_07]
    at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.7.0_07]
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262) [jbossweb-7.0.13.Final.jar:]
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    ... 28 more

person Lester    schedule 18.10.2012    source източник


Отговори (1)


Трябва да създадете екземпляр на вашия cart списък, преди да го използвате.

Можете да направите това във вашия метод @PostConstruct на CartBean по следния начин:

@PostConstruct
public void init() {
    cart= new ArrayList<Item>();
}
person Ravi Kadaboina    schedule 18.10.2012
comment
О да. Благодаря ти! Това определено беше една грешка. Но не мога ли просто да направя така?: private List‹Item› cart = new ArrayList‹Item›(); Защо PostConstruct? Все още не работя, но се промени малко. Трябва да разбера... когато се събудя отново. - person Lester; 19.10.2012
comment
Методът @PostConstruct се изпълнява след всяко инжектиране на зависимост за извършване на инициализация. Обикновено е полезно да се изтеглят данни след инжектирането на всички зависимости, за да се покажат на страница и е една от най-добрите практики. Вижте също stackoverflow.com/questions /12320563/ и weblogs.java.net/ blog/jhook/archive/2007/05/ - person Ravi Kadaboina; 19.10.2012
comment
Във вашия случай това няма да има значение, тъй като не го инициализирате с никакви данни и не е необходимо да инстанцирате в метода @PostConstruct. - person Ravi Kadaboina; 19.10.2012
comment
Благодаря ти, Рави, за отговора и допълнителния поясняващ коментар - много полезен! :) Не знам защо преди 15 часа не работеше, а сега работи. - person Lester; 19.10.2012