[英]NullPointer with Primefaces GMap OverlaySelect event
I have a problem with Primefaces whose version is 3.0.M3 . 我的Primefaces版本为3.0.M3有问题。 I used gmap and prime p:ajax.I wanted to do something is to get clicked Marker when a marker is clicked by a user on Gmap.
我使用了gmap和prime p:ajax。我想做点什么就是当Gmap上的用户点击标记时点击Marker。
Here is the Code 这是守则
<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>
and My ManagedBean 和我的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 Declarations 托管Bean声明
@ManagedBean(name="mapBean")
@RequestScoped
public class MapBean implements Serializable
I am taking NullPointerException
in onMarkerSelect
method.( event.getOverlay();
) 我在
onMarkerSelect
方法中使用NullPointerException
。( event.getOverlay();
)
Fixed my problem. 解决了我的问题。
The problem was that when the MapModel
was created it was a local var: 问题是,当创建
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;
}
The whole mapModel
could be garbage collected after the map is rendered (as it is no longer needed). 渲染地图后可以对整个
mapModel
进行垃圾收集(因为不再需要)。 So when the overlay event is called there would be no mapModel
any more. 因此,当调用overlay事件时,将不再有
mapModel
。
As soon as I made mapModel
a field of the Bean
the problem disappeared. 一旦我使
mapModel
成为Bean
的一个字段,问题就消失了。
Use the static
field as follows. 使用
static
字段如下。 It worked for me. 它对我有用。
final static MapModel mapModel = new DefaultMapModel();
final DefaultMapModel mapModel = new DefaultMapModel();
曾作为全局变量工作,在viewScoped最佳vj
Got through this and solved by changing scope for the Bean to ViewScoped
instead of Request Scope, so it lasts during user activity. 通过这个并通过将Bean的范围更改为
ViewScoped
而不是Request Scope来解决,因此它在用户活动期间持续。
No final/static declarators needed 不需要最终/静态声明器
@ManagedBean(name="mapBean")
@ViewScoped
public class MapBean implements Serializable {
private MapModel draggableModel;
...
}
只需将bean范围更改为@SessionScoped
或@ViewScoped
这样就不会为每个请求初始化bean。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.