NullPointer与Primefaces GMap OverlaySelect事件

Cet*_*mre 5 java jsf primefaces primefaces-gmap

我的Primefaces版本为3.0.M3有问题.我使用了gmap和prime p:ajax.我想做点什么就是当Gmap上的用户点击标记时点击Marker.

这是守则

<p:tabView effect="slide" effectDuration="normal" style="width:1050px;height:450px" >
            <p:tab title="blabla">
                <h:panelGrid colums="1">    
                </h:panelGrid>
            </p:tab>
            <p:tab title="blabla" >
                <h:panelGrid colums="1">
                    <h:form id="mapId">

                        <p:gmap  id="asd" center="39.000409,35.201554" 
                            zoom="#{mapBean.modelMap.zoomLevel}" 
                            type="ROADMAP" 
                            style="width:1000px;height:400px"
                            model="#{mapBean.emptyModel}"
                            widgetVar="map" >

                            <p:ajax event="overlaySelect" listener="#{mapBean.onMarkerSelect}"/>

                        </p:gmap>

                    </h:form>   
                </h:panelGrid>
            </p:tab></p:tabView>
Run Code Online (Sandbox Code Playgroud)

和我的ManagedBean

public void onMarkerSelect(OverlaySelectEvent event) {  

    Marker marker = (Marker) event.getOverlay();
    if (marker!=null) {
        System.out.println(marker.getId());
    }
    System.out.println("Clicked");
    modelMap.setZoomLevel(modelMap.getZoomLevel()+1);

}
Run Code Online (Sandbox Code Playgroud)

托管Bean声明

@ManagedBean(name="mapBean")
@RequestScoped
public class MapBean implements Serializable 
Run Code Online (Sandbox Code Playgroud)

我采取NullPointerExceptiononMarkerSelect方法.( event.getOverlay();)

Sim*_*eon 6

解决了我的问题.

问题是,当MapModel创建它时,它是一个本地var:

public MapModel getModel() {

    final MapModel mapModel = new DefaultMapModel(); // this should be a field

    final Set<MapEventDto> events = service.loadEvents();
    for (MapEventDto event : events) {

        final double latitude = event.getLatitude().doubleValue();
        final double longitude = event.getLongitude().doubleValue();
        final String magnitude = event.getMagnitude().toString();

        final String title = "Id: " + event.getId() + ", Lat: " + latitude + ", Lng: " + longitude + ", Mag: " + magnitude;

        mapModel.addOverlay(new Marker(new LatLng(latitude, longitude), title));

    }
    return mapModel;
}
Run Code Online (Sandbox Code Playgroud)

mapModel渲染地图后可以对整个进行垃圾收集(因为不再需要).因此,当调用叠加事件时,将不再mapModel有.

一旦我做mapModel了一个领域,Bean问题就消失了.

  • JSF中的一般规则是getter/setter应该**不做任何其他事情,而不仅仅是*他们命名的工作:获取和设置属性.准备数据应该在(post)构造函数或(action)侦听器方法中完成,或者在getter中的最高延迟加载时完成.另见http://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple-times (2认同)