我有一個spring bean的DAO類,它有一個方法reverseLookup(),它返回一個List <字符串>。我將這個bean注入到2個wicket組件中,並在每個組件的ajax調用中調用相同的方法。Wicket SpringBean在一個面板上生成NotSerializableException但不是另一個
在第一個面板中,它工作正常,沒有問題。在第二個面板中,我得到一個NotSerializableException。
DAO類不是可序列化的,但它不應該是。我使用@SpringBean來注入bean(並且在此大型應用程序中注入了@SpringBean的其他幾十個bean,它們都可以正常工作)
直到ajax調用完成並且頁面被序列化,纔會發生該錯誤。然後在每個連續的請求週期中失敗。
我看不出有什麼特別的DAO類 - 它沒有成員變量或做任何特殊的其他DAO類。我不明白爲什麼它在一個小組中能夠正常工作,但不能在另一個小組中工作。
我試過在冒犯的面板中使用成員變量瞬態,並使用注入器,但它沒有區別。
的DAO接口:
public interface StringResourceDAO extends EntityDAO<StringResource, Long> {
.. other methods
public List<String> reverseLookup(TranslationType p_type, String p_searchString, Locale p_locale, String p_style, String p_variation) throws GetException;
}
的DAO類:
public class StringResourceJpaDAO extends AbstractEntityJpaDAO<StringResource> implements StringResourceDAO {
... other methods
@Override
public List<String> reverseLookup(TranslationType p_type, String p_searchString, Locale p_locale, String p_style, String p_variation) throws GetException {
ViewCriteria<StringResource> resourceCriteria = new ViewCriteria<>();
resourceCriteria.addFilter(new EqualityFilter<String>(StringResource_.key, Operator.STARTS_WITH, p_type.getPrefix()));
resourceCriteria.addFilter(EqualityFilter.equalFilter(StringResource_.localeCountry, p_locale == null ? null : StringUtils.defaultIfEmpty(p_locale.getCountry(), null)));
resourceCriteria.addFilter(EqualityFilter.equalFilter(StringResource_.localeLanguage, p_locale == null ? null : StringUtils.defaultIfEmpty(p_locale.getLanguage(), null)));
resourceCriteria.addFilter(new EqualityFilter<String>(StringResource_.value, Operator.LIKE, "%" + p_searchString + "%").setCaseSensitive(false));
resourceCriteria.setDistinctResults(true);
resourceCriteria.setMaxResults(250);
List<String> matchingKeys = super.getOtherProperty(l_resourceCriteria, StringResource.class, String.class, StringResource_.key.getName());
return new ProxyList<String,String>(l_matchingKeys) {
private static final long serialVersionUID = 1L;
@Override
public String getItem(String p_proxy) {
return TranslationType.removePrefix(p_type, p_proxy);
}
};
}
}
AbstractEntityJpaDAO是由所有其他DAO實現中使用的父類。 ProxyList只是一個pre-stream()包裝器實現列表,允許訪問列表屬性而不必複製列表的內容。 ViewCriteria充當下層中的JPA與上面用於創建數據查詢的UI邏輯之間的橋樑。
(未在ModalWindow面板),其正常工作的部件:
public abstract class ServiceLevelLookupPanel extends AbstractDialogPanel {
@SpringBean
protected StringResourceDAO m_resourceService;
protected void onInitialize() {
TextField<String> serviceLevelNumberField = new TextField<String>("serviceLevelNumberField", m_serviceLevelNumberModel);
// HAVE to set this to not required, otherwise the onchange event won't fire if the user empties the text field
serviceLevelNumberField.setRequired(false);
serviceLevelNumberField.setConvertEmptyInputStringToNull(true);
serviceLevelNumberField.add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget p_target) {
String slNumber = getSearchString();
// works just fine!
List<String> translationReverseLookupCodes = m_resourceService.reverseLookup(TranslationType.SERVICE_LEVEL_DESCRIPTION, slNumber, getLocale(), null, null);
}
});
}
}
失敗(一個ModalWindow內面板)將成分:
public class ChooseServiceLevelPanel extends Panel implements IAjaxIndicatorAware {
@SpringBean
protected StringResourceDAO m_resourceService;
protected void onInitialize() {
...
AjaxSubmitLink searchButton = new AjaxSubmitLink("searchButton") {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit(AjaxRequestTarget p_target, Form<?> p_form) {
// once this is called, subsequent page serializations fail!
List<String> matchingServiceLevelCodes = m_resourceService.reverseLookup(TranslationType.SERVICE_LEVEL_DESCRIPTION, m_descriptionModel.getObject(), getLocale(), null, null);
}
};
searchForm.add(l_searchButton);
}
唯一的區別/事物請注意,我可以看到的是:
- 失敗的人在ajax表單提交(非失敗的人不使用表單)
- 有2種形式的失敗頁面上(一個提交的搜索參數,可以將其他選擇搜索結果)
- 的失敗之一是內部ModalWindow
面板有沒有人有任何類似的問題?
感謝