NullPointer с Primefaces GMap OverlaySelect событие - PullRequest
5 голосов
/ 16 декабря 2011

У меня проблема с Primefaces, версия которой 3.0.M3. Я использовал 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>

и My 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);

}

Объявления управляемых бинов

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

Я принимаю NullPointerException по методу onMarkerSelect. (event.getOverlay();)

Ответы [ 5 ]

6 голосов
/ 06 июня 2012

Исправил мою проблему.

Проблема заключалась в том, что при создании 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;
}

Весь mapModel мог быть собран после сборкикарта отображается (так как она больше не нужна).Поэтому, когда вызывается событие оверлея, больше не будет mapModel.

Как только я сделал mapModel поле Bean, проблема исчезла.

3 голосов
/ 10 декабря 2012

Используйте поле static следующим образом.У меня это сработало.

final static MapModel mapModel = new DefaultMapModel();
0 голосов
/ 13 января 2014

Просто измените область действия вашего компонента на @SessionScoped или @ViewScoped, чтобы ваш компонент не был инициализирован для каждого запроса.

0 голосов
/ 08 октября 2013

Пройдя через это, мы решили проблему, изменив область действия Бина на ViewScoped вместо Области запроса, поэтому она сохраняется во время активности пользователя.

Конечные / статические объявления не нужны

  @ManagedBean(name="mapBean")
  @ViewScoped
  public class MapBean implements Serializable {  
    private MapModel draggableModel;   
    ...
  }
0 голосов
/ 08 августа 2013
final DefaultMapModel mapModel = new DefaultMapModel();

работает как глобальная переменная, в viewScoped best vj

...