0

Facelet では、<pe:remoteCommand>backingbean の値を更新するために使用しようとしています。

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

リモートコマンド「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 = [];
    }              
}

私のバッキングビーンは次のとおりです。

@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これは、リモート コマンドのフィールドが原因であると確信しています。そのフィールドを削除すると、問題なく動作するからです。ドロップダウン リストから取得した選択した値がリモート コマンドに送信されない理由がわかりません。誰も問題がどこにあるのか知っていますか?

4

1 に答える 1

0

どこが間違っていたのかはまだわかりませんが、プライムフェイスの拡張機能でリモートコマンドを使用する代わりに、プライムフェイスで元のリモートコマンドを試してみたところ、うまくいきました。

変更後のコードは次のとおりです。

<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);
于 2013-03-18T01:01:59.123 に答える