2011-12-15 22 views
5

我的版本爲3.0.M3的Primefaces有問題。 我使用gmap和prime p:ajax.I想要做的事情是當用戶在Gmap上點擊標記時點擊標記。帶Primefaces GMap OverlaySelect事件的NullPointer

這裏是代碼

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

和我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); 

} 

Managed Bean的聲明

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

我在onMarkerSelect方法服用NullPointerExceptionevent.getOverlay();

+0

您是否嘗試升級到M4或RC1? – spauny 2011-12-16 09:33:03

+0

我有完全相同的問題。 – Simeon 2012-06-06 08:09:06

+0

嘗試了幾個primefaces的版本(所有從3.1到3.3)我有同樣的問題與他們所有人。 – Simeon 2012-06-06 08:19:21

回答

6

解決了我的問題。

的問題是,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的字段,問題就消失了。

3

如下使用static字段。 它爲我工作。

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

工作了爲全局變量,在viewScoped 最好 VJ

0

撥通了這一點,並通過改變範圍的Bean來ViewScoped而不是請求範圍內解決,所以它的用戶活動期間持續。

沒有最後/靜態聲明符需要

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

只是你的bean範圍更改爲@SessionScoped@ViewScoped所以你的bean不會爲每個請求初始化。