简体   繁体   English

NullPointer与Primefaces GMap OverlaySelect事件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM