2013-03-15 107 views
0

在一个facelet,我尝试使用<pe:remoteCommand>更新backingbean值:显示java.lang.NullPointerException在org.primefaces.extensions.component.remotecommand.RemoteCommandRenderer.decode

<pe:remoteCommand name="saveMapArea" process="@this" actionListener="#{defineMapArea.createMapArea}"> 
    <pe:assignableParam name="areaString" assignTo="#{defineMapArea.tagMapArea.mapArea}"/> 
    <pe:assignableParam name="areaName" assignTo="#{defineMapArea.tagMapArea.name}" /> 
    <pe:assignableParam name="castId" assingTo="#{defineMapArea.tagMapArea.castId}" />   
</pe:remoteCommand> 

castId值从下拉列表中检索列表中的jQuery当用户点击提交按钮,下拉列表中的代码是:

<h:selectOneMenu id="area_assign_device"> 
    <f:selectItem itemLabel="Select Icast" itemValue="" /> 
    <f:selectItems value="#{defineMapArea.castList}" var="cast" itemLabel="#{cast.name}" itemValue="#{cast.castId}"/> 
</h:selectOneMenu> 

的提交按钮的代码是:

<p:commandButton value="Submit" type="button" onclick="CreateArea.saveArea()"/> 

调用remotecommand 'saveMapArea' 的代码是:

saveArea : function() { 
    if(CreateArea.validate()) { 
     // ...some other code to init map area... 

     var name=jQuery('#area_name_text').val(); 
     var castId=jQuery('#area_assign_device').val(); 
     saveMapArea(mapArea, name, castId); 
     CreateArea.points = []; 
    }    
} 

和我支持bean是:

@ManagedBean 
@RequestScoped 
public class DefineMapArea extends BaseJsfBean { 

    private static final long serialVersionUID = 1L; 
    private static Log log = LogFactory.getLog(DefineMapArea.class); 
    private TagMapArea tagMapArea; 
    private List<TagMapArea> areaList; 
    private String areaListJson; 

    @ManagedProperty(value="#{tagCustomService}") 
    private ITagCustomService tagCustomService; 

    @Override 
    protected void init() throws Exception { 
     // ..some initializations... 
    } 

    public void createMapArea() { 
     log.info("Area Persisting : " + tagMapArea.getMapArea());    
     tagMapArea.setTagMapImageId(2); 
     tagMapArea.setMapAreaType("test"); 
     tagMapArea.setDescription("test"); 
    } 

    // ....all the getters and setters.... 
} 

TagMapArea是JPA实体,包括castId场的部分是:

@Column(name = "cast_id", nullable = false) 
protected Integer castId; 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="cast_id", nullable=false, insertable=false, updatable=false) 
protected TagCast cast;  

问题是当我点击提交按钮时,它会抛出一个NullPointerException这样的:

java.lang.NullPointerException 
    at org.primefaces.extensions.component.remotecommand.RemoteCommandRenderer.decode(RemoteCommandRenderer.java:82) 
    at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1377) 
    at org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:731) 
    at org.apache.myfaces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:214) 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:932) 

我敢肯定,这是由castId场在远程命令造成的,因为如果我删除该字段,它工作正常。我很困惑为什么从下拉列表中检索的选定值没有发送到远程命令。有人知道问题在哪里吗?

回答

0

仍然不知道哪里出了问题,但我发现四处走走,而不是在primefaces扩展中使用远程命令,我尝试了primefaces中原始的远程命令,它的工作原理。

更改后的代码是:

<p:remoteCommand name="saveMapArea" actionListener="#{defineMapArea.createMapArea}" /> 

和JavaScript部分,就变成:

saveMapArea([{name:'mapArea', value:mapArea},{name:'name',value:name},{name:'castId',value:castId}]); 
在支持Bean的createMapArea方法

,该代码段获得价值观是:

FacesContext context = FacesContext.getCurrentInstance(); 
    Map map = context.getExternalContext().getRequestParameterMap(); 
    String mapArea = (String)map.get("mapArea"); 
    String name = (String)map.get("name"); 
    String castId = (String)map.get("castId"); 
    log.info("Area Persisting : " + mapArea); 
    log.info("name: " + name + " castId: " + castId); 
相关问题