2014-05-18 41 views
0

我現在使用5.0,但在4.0是做同樣的。 3.5版很好。Primefaces計劃和selectEvent

我有一個ScheduleEvent實現,我用jpa存儲在postgreSQL表中。 我使用懶惰數據模型,所以我可以堅持新的事件,並加載回來。事件和標題出現在schedult中。

ScheduleManager是一個會話範圍的bean,我處理ajax事件,如onEventMove,onEventResize和onEventSelect。 最後一個事件處理函數getObject方法返回null,所以我不能編輯事件。

我的情況下實現這樣的:

@Entity 
@Table(name = "basescheduleevent") 
@NamedQuery(name = "BaseScheduleEvent.findAll", query = "SELECT l FROM BaseScheduleEvent l") 
public class BaseScheduleEvent implements ScheduleEvent, Serializable { 

    private static final long serialVersionUID = 6213082779383114637L; 

    private String id; 
    private String title; 
    private Object data; 
    private Date startDate; 
    private Date endDate; 
    private String description; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(unique = true, nullable = false) 
    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @Lob 
    @Override 
    public Object getData() { 
     return this.data; 
    } 

    public void setData(Object data) { 
     this.data = data; 
    } 
... 

和處理方法是這樣的:

public void onEventSelect(SelectEvent selectEvent) { 
     ScheduleEvent event = (ScheduleEvent) selectEvent.getObject(); 
     if (event != null) { 
     EventHistory eventHistory = (EventHistory) event.getData(); 
     Subject subject = eventHistory.getSubject(); 
     } 
    } 

這裏是XHTML時間表:

<h:form id="ScheduleForm"> 
    <p:schedule style="width:100%;height:100%" view="month" id="schedule" widgetVar="scheduleWidget" 
     timeZone="Europe/Budapest" widgetVar="scheduleWidget" locale="hu" 
     value="#{scheduleManager.eventModel}" 
     binding="#{scheduleManager.schedule}"> 
     <p:ajax event="dateSelect" 
      listener="#{scheduleManager.onDateSelect}" update=":timerForm" 
      oncomplete="PF('timerDialogWidget').show();" /> 
     <p:ajax event="eventSelect" 
      listener="#{scheduleManager.onEventSelect}" update=":timerForm" 
      oncomplete="PF('timerDialogWidget').show();" /> 
     <p:ajax event="eventMove" listener="#{scheduleManager.onEventMove}" /> 
     <p:ajax event="eventResize" 
      listener="#{scheduleManager.onEventResize}" /> 
    </p:schedule> 
</h:form> 

所以我用Google搜索周圍的解決方案,但我找不到解決方案。我發現老式的黃金事件處理程序和解決方案。

移動並調整大小在事件處理程序之前有空指針異常。

請讓我知道解決方案。

我把乾淨的方法調用加載方法SessionScoped豆:

@Named 
@SessionScoped 
public class ScheduleManager implements Serializable { 

    private static final long serialVersionUID = 620934289508314544L; 

    private BaseScheduleEvent currentEvent; 

    private ScheduleModel lazyEventModel; 

    @Inject 
    private UserService userService; 

    @Inject 
    private ScheduleService scheduleService; 

    public ScheduleModel getEventModel() { 
     lazyEventModel = new LazyScheduleModel() { 

     private static final long serialVersionUID = -7030798462691388329L; 

     public void loadEvents(Date start, Date end) { 

      final TimeZone timeZone = TimeZone.getTimeZone("Europe/Budapest"); 
      List<ScheduleEvent> eventList = scheduleService.loadEvents(
        start, end, timeZone); 
      clear(); 
      for (ScheduleEvent event : eventList) { 
       addEvent(event); 
      } 
     } 
     }; 
     return lazyEventModel; 
    } 

在Schedule.java我發現了一些可以幫助發現問題。一個id缺失。

else if(eventName.equals("eventSelect")) { 
     String selectedEventId = params.get(clientId + "_selectedEventId"); 
    ScheduleEvent selectedEvent = this.getValue().getEvent(selectedEventId); 

     wrapperEvent = new SelectEvent(this, behaviorEvent.getBehavior(), selectedEvent); 

this.getValue()。getEvent()給回零(的getValue事件ArrayList.size = 0,這是爲什麼selectedEvent爲空)。 但是,這個運行後堅持的對象,和事件有ID,我在數據庫確認。事件加載回調度器,我看到視圖中的事件。當我加載回事件時,每個都有id值。

在DefaultScheduleModel在公共ScheduleEvent getEvent(字符串ID)的ID參數獲得在for循環 「e3fdce6b-8f4b-4b41-b6f4-19c0a9496e63」 值和(ArrayList的)events.size = 0(ScheduleEvent事件:事件) 但是,每當我在SessionScoped bean方法中檢查id時,id爲null。

回答

0

該解決方案更容易。只需添加一個檢查null。

public ScheduleModel getEventModel() { 
    if (lazyEventModel == null) { 
    lazyEventModel = new LazyScheduleModel() {