2011-12-15 21 views
5

Mam problem z Primefaces, którego wersja to 3.0.M3. Użyłem gmap i prime p: ajax. Chciałem coś zrobić, aby kliknąłem Marker po kliknięciu znacznika przez użytkownika na Gmap.NullPointer z Primefaces GMap OverlayWybierz zdarzenie

Oto kod

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

i 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); 

} 

Managed Bean Deklaracje

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

Biorę NullPointerException w onMarkerSelect metody. (event.getOverlay();)

+0

Czy próbowałeś dokonać aktualizacji do M4 lub RC1? – spauny

+0

Mam dokładnie ten sam problem. – Simeon

+0

Wypróbowałem kilka wersji podstawowych (wszystkie od 3.1 do 3.3) Mam taki sam problem z wszystkimi z nich. – Simeon

Odpowiedz

6

Naprawiono problem.

Problem polegał na tym, że gdy MapModel został stworzony był to lokalny 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; 
} 

Cały mapModel mogą być zbierane śmieci po mapie staje się (jak to już nie jest potrzebne). Tak więc, gdy zostanie wywołane zdarzenie nakładkowe, nie będzie już żadnego mapModel.

Po utworzeniu mapModel pola z numerem Bean problem zniknął.

+0

Jeśli ktoś inny mógłby to sprawdzić, byłbym bardzo wdzięczny. – Simeon

+2

Ogólna zasada w JSF polega na tym, że podmioty pobierające/ustawiające nie powinny ** robić nic innego niż robienie * tylko * zadania, dla którego je nazwano: pobieranie i ustawianie właściwości. Przygotowanie danych powinno odbywać się w konstruktorze (post) lub metodą detektora akcji lub przy najwyższym leniwym ładowaniu w pobierającym. Zobacz także http://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple-times – BalusC

3

Użyj pola static w następujący sposób. To zadziałało dla mnie.

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

Zgodnie z regułą, pola statyczne nie powinny reprezentować stanu, ponieważ torujesz drogę dla wielu bólów głowy . – Simeon

0
final DefaultMapModel mapModel = new DefaultMapModel(); 

pracował Bo jak zmienna globalna, w viewScoped najlepszą VJ

0

dotarło to i rozwiązane poprzez zmianę zakresu dla Bean do ViewScoped zamiast żądania zakresu, tak, że trwa w czasie aktywności użytkownika .

Brak declarators końcowe/statyczne potrzebne

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

Wystarczy zmienić zakres Bean @SessionScoped lub @ViewScoped więc fasola nie zostanie zainicjowany na każde żądanie.

Powiązane problemy