NullPointer with Primefaces GMap OverlaySelect event



我对版本为3.0.M3的Primefaces有问题。我使用了gmap和prime p:ajax。我想做的是,当用户在Gmap上单击标记时,单击标记。

这是代码

<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>

和我的管理豆

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);
}

托管 Bean 声明

@ManagedBean(name="mapBean")
@RequestScoped
public class MapBean implements Serializable 

我正在onMarkerSelect方法中采取NullPointerException。( event.getOverlay(); (

解决了我的问题。

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

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;
}

渲染地图后,整个mapModel可能会被垃圾回收(因为不再需要它(。因此,当调用覆盖事件时,将不再有mapModel

一旦我mapModel Bean的领域,问题就消失了。

按如下方式使用static字段。它对我有用。

final static MapModel mapModel = new DefaultMapModel();
final DefaultMapModel mapModel = new DefaultMapModel();

作为全局变量工作,在视图中范围最好VJ

通过将 Bean 的范围更改为 ViewScoped 而不是请求范围来解决并解决了这个问题,因此它在用户活动期间持续存在。

无需最终/静态声明符

  @ManagedBean(name="mapBean")
  @ViewScoped
  public class MapBean implements Serializable {  
    private MapModel draggableModel;   
    ...
  }

只需将 Bean 范围更改为 @SessionScoped@ViewScoped,这样您的 Bean 就不会为每个请求初始化。

相关内容

  • 没有找到相关文章

最新更新