【发布时间】:2014-05-18 09:27:03
【问题描述】:
我现在使用 5.0,但在 4.0 中也是如此。使用 3.5 效果很好。
我有一个 ScheduleEvent 实现,我用 jpa 将它存储在 postgreSQL 表中。 我使用惰性数据模型,所以我可以持久化新事件,然后将它们加载回来。事件和标题出现在计划中。
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>
所以我四处搜索解决方案,但找不到解决方案。我找到了老的 primeface 事件处理程序和解决方案。
移动和调整大小在事件处理程序之前有空指针异常。
请告诉我解决方案。
我把一个干净的方法调用加载到 SessionScoped bean 中:
@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() 返回 null(getValue 事件 ArrayList.size = 0,这就是为什么 selectedEvent 为 null)。 但是这个在持久化对象之后运行,并且事件有 id,我在数据库中确认了。事件加载回调度程序,我在视图中看到了事件。当我加载回事件时,每个事件都有 id 值。
在 DefaultScheduleModel at public ScheduleEvent getEvent(String id) 中获取 id 参数 "e3fdce6b-8f4b-4b41-b6f4-19c0a9496e63" 值和 for 循环中的 (ArrayList)events.size = 0 (ScheduleEvent 事件:事件) 但是每次我在 SessionScoped bean 方法中检查 id 时,id 都是空的。
【问题讨论】:
标签: java jsf primefaces schedule