Java 带有Primefaces GMap OverlySelect事件的空指针

Java 带有Primefaces GMap OverlySelect事件的空指针,java,jsf,primefaces,primefaces-gmap,Java,Jsf,Primefaces,Primefaces Gmap,我对版本为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 c

我对版本为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>
托管Bean声明

@ManagedBean(name="mapBean")
@RequestScoped
public class MapBean implements Serializable 
我正在MarkerSelect方法中使用
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;
}
publicmapmodel getModel(){
final MapModel MapModel=new DefaultMapModel();//这应该是一个字段
最终设置事件=service.loadEvents();
for(映射事件到事件:事件){
最终双纬度=event.getLatitude().doubleValue();
最终双经度=event.getLongitude().doubleValue();
最终字符串大小=event.getmagnity().toString();
最后一个字符串title=“Id:”+event.getId()+”,Lat:“+纬度+”,Lng:“+经度+”,Mag:“+幅度;
addOverlay(新标记(新纬度、经度、标题));
}
返回映射模型;
}
整个
mapModel
可以在映射渲染后进行垃圾收集(因为不再需要它)。因此,当调用覆盖事件时,将不再有
mapModel


我一创建
mapModel
Bean的一个字段问题就消失了。

使用
静态
字段,如下所示。 这对我有用

final static MapModel mapModel = new DefaultMapModel();
作为全局变量在ViewScope中工作 最好的
vj

解决了这个问题,将Bean的作用域改为
ViewScoped
,而不是Request作用域,因此它在用户活动期间保持不变

不需要最终/静态声明器

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

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

您是否尝试过升级到M4或RC1?我遇到了完全相同的问题。尝试了几个primefaces版本(都从3.1到3.3)我对它们都有同样的问题。如果其他人也能测试这一点,我将不胜感激。JSF中的一般规则是getter/setter不应该做任何事情,而应该只做它们命名的工作:获取和设置属性。准备数据应该在(post)构造函数或(action)侦听器方法中完成,或者在getter的最高延迟加载中完成。另请参见经验法则,静态字段不应表示状态,因为您为许多头痛铺平了道路。
final DefaultMapModel mapModel = new DefaultMapModel();
  @ManagedBean(name="mapBean")
  @ViewScoped
  public class MapBean implements Serializable {  
    private MapModel draggableModel;   
    ...
  }