gpt4 book ai didi

java - 嵌套 ModalWindow 的 Wicket 序列化问题

转载 作者:行者123 更新时间:2023-12-02 06:11:40 36 4
gpt4 key购买 nike

我在 Java 和 Apache Wicket 1.5 中遇到了一个问题,其中两个匿名类的封闭 Java 对象的标识已更改!

在一个 Wicket 模态窗口中,我想创建第二个模态窗口(用于获取文本字符串提示),然后通过模型的 AJAX 刷新(字符串-整数对的列表)来更新原始模态窗口。

基本上,我用同一方法创建了两个匿名类,但一个匿名类与另一个匿名类之间的封闭实例的“this”指针不同。

对我来说,这似乎不是正常的预期 JVM 行为,但我也无法在 Java 规范中找到其工作原理的任何细节。

public class DropDownChoiceModal extends WebPage {

public String newTermResponse;

private void addAddTermModal() {
addTermModal = new ModalWindow("add_term_modal");
addTermModal.setPageCreator(new ModalWindow.PageCreator() {
public Page createPage() {
PropertyModel pm = new PropertyModel<String>(DropDownChoiceModal.this, "newTermResponse");
System.out.println ("propModel: " + System.identityHashCode(DropDownChoiceModal.this));
return new TextInputModal(addTermModal, "What is the new term you wish to add?", pm);
}
});

addTermModal.setWindowClosedCallback(new WindowClosedCallback() {
public void onClose(AjaxRequestTarget target) {

System.out.println ("propModel: " + System.identityHashCode(DropDownChoiceModal.this));
System.out.println ("newTermResponse: " + DropDownChoiceModal.this.newTermResponse);

// If the value is set then use it
if (newTermAvailable()) {

// Add the new term to the model
model.add(new StringIntegerPair (newTermResponse, 0));

System.out.println ("Update view: " + model.size());

// Update the view
target.add(wmc);
}
System.out.println ("No new term");
}

private boolean newTermAvailable() {
return (newTermResponse != null) && !newTermResponse.isEmpty();
}
});

add(addTermModal);
}

对于 TextInputModal 类:

public class TextInputModal extends WebPage {

public TextInputModal(final ModalWindow modal, String requestString, final IModel<?> model) {
Form<String> form = new Form<String>("form") {
public void onSubmit() {
System.out.println ("Submitted: " + System.identityHashCode(((PropertyModel)model).getTarget()) + "; " + model.getObject());
}
};

// Add the buttons
form.add(new AjaxButton("ok") {
public void onAfterSubmit(AjaxRequestTarget target, Form<?> form) {
System.out.println ("Submitted 2: " + System.identityHashCode(((PropertyModel)model).getTarget()) + "; " + model.getObject());
modal.close(target);
}
});

// Add the form
add(form);
}
}

我得到的输出:

propModel: 698650686
Submitted: 698650686; fdsfds
Submitted 2: 698650686; fdsfds
propModel: 1447892364
newTermResponse: null
No new term

为什么匿名类 1 ( new ModalWindow.PageCreator() {} ) 和匿名类 2 ( new WindowClosedCallback() {} ) 创建时封闭实例 (DropDownChoiceModal.this) 的标识发生了变化?相同的方法( addAddTermModal() )?

提前致谢...

奈杰尔

最佳答案

非常感谢上面评论中的 biziclop...看起来 Wicket 在序列化对象时正在破坏该对象 - “newTermResponse”字符串的内容在此序列化过程中在某个地方丢失了。

我回到这里的嵌套 ModalWindow 示例:

http://www.wicket-library.com/wicket-examples/ajax/modal-window

使用示例中所示的 getPageReference() 而不是 PropertyModel 解决了我的问题。

干杯,

奈杰尔

关于java - 嵌套 ModalWindow 的 Wicket 序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13169059/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com