Tại $ dayjob tôi, chúng tôi sử dụng cái gì những gì bạn mô tả, và những gì tôi có presented at several meetups (xem trượt 23 và trên). Bạn không cần phải nêm Wicket cho điều đó.
Về cơ bản những gì bạn làm là sao chép mã kiểm tra serializer và sửa đổi nó để bao gồm kiểm tra của bạn cũng như kiểm tra các lỗi serialization. Sau đó, trong giai đoạn cuối của chu kỳ yêu cầu bạn chạy trình kiểm tra bộ nối tiếp của riêng bạn trên các trang bị ảnh hưởng.
Vui lòng cung chúng tôi tạo ra kiểm tra cho lớp cơ sở chung của chúng ta, và thời tiết hay không thực thể có ben vẫn kiên trì. Nếu vậy, chúng tôi sẽ không yêu cầu. Ngoài ra chúng tôi có một cuộc gọi lại Ajax trong trang cơ sở của chúng tôi để kiểm tra thuộc tính phiên để xem có lỗi tuần tự hóa hay không. Nếu vậy, chúng tôi chuyển hướng đến trang lỗi với sự thất bại serialization, để đảm bảo rằng các nhà phát triển không bỏ qua các thực thể trong hệ thống phân cấp trang.
Dưới đây là thịt của kiểm tra của chúng tôi (các phương pháp check
viết lại từ séc serializer Wicket của):
private void check(Object obj)
{
if (obj == null || obj.getClass().isAnnotationPresent(Deprecated.class)
|| obj.getClass().isAnnotationPresent(SkipClass.class))
{
return;
}
Class<?> cls = obj.getClass();
nameStack.add(simpleName);
traceStack.add(new TraceSlot(obj, fieldDescription));
if (!(obj instanceof Serializable) && (!Proxy.isProxyClass(cls)))
{
throw new WicketNotSerializableException(toPrettyPrintedStack(obj.getClass().getName())
.toString(), exception);
}
if (obj instanceof IdObject)
{
Serializable id = ((IdObject) obj).getIdAsSerializable();
if (id != null && !(id instanceof Long && ((Long) id) <= 0))
{
throw new WicketContainsEntityException(toPrettyPrintedStack(
obj.getClass().getName()).toString(), exception);
}
}
if (obj instanceof LoadableDetachableModel)
{
LoadableDetachableModel<?> ldm = (LoadableDetachableModel<?>) obj;
if (ldm.isAttached())
{
throw new WicketContainsAttachedLDMException(toPrettyPrintedStack(
obj.getClass().getName()).toString(), exception);
}
}
Đối với Wicket 1.5 chúng tôi tạo riêng của chúng tôi PageStoreManager
mà thực hiện những kiểm tra (và rất nhiều thứ khác, như cho phép lịch sử duyệt web phía máy chủ cho người dùng của chúng tôi). Chúng tôi cung cấp riêng RequestAdapter
của chúng tôi bằng cách ghi đè PageStoreManager#newRequestAdapter(IPageManagerContext context)
và làm việc kiểm tra tuần tự trong bộ chuyển đổi:
class DetachCheckingRequestAdapter extends RequestAdapter
{
public DetachCheckingRequestAdapter(IPageManagerContext context)
{
super(context);
}
@Override
protected void storeTouchedPages(List<IManageablePage> touchedPages)
{
super.storeTouchedPages(touchedPages);
if (Application.get().usesDevelopmentConfig())
{
for (IManageablePage curPage : touchedPages)
{
if (!((Page) curPage).isErrorPage())
testDetachedObjects(curPage);
}
}
}
private void testDetachedObjects(final IManageablePage page)
{
try
{
NotSerializableException exception = new NotSerializableException();
EntityAndSerializableChecker checker = new EntityAndSerializableChecker(exception);
checker.writeObject(page);
}
catch (Exception ex)
{
log.error("Couldn't test/serialize the Page: " + page + ", error: " + ex);
Session.get().setDetachException(ex);
}
}
}
Nguồn
2011-11-30 10:30:30
Tôi đã thực hiện điều này trong ứng dụng của tôi, và nó hoạt động như một nét duyên dáng. Nó sẽ là một chút neater nếu Wicket có một điểm tập tin đính kèm thuận tiện cho kiểm tra phiên, nhưng điều này là khá duy trì. Cảm ơn. –
Bạn được chào đón. Bạn được tự do gửi yêu cầu tính năng. Thật không may, chúng tôi không thể thực hiện việc kiểm tra chung này, nhưng việc có thể mở rộng khung công tác theo cách rõ ràng hơn sẽ tốt hơn. –