2017-03-14 53 views
0

我有一個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

面板有沒有人有任何類似的問題?

感謝

回答

2

(萬一有人張貼了類似的問題)

問題是因爲ProxyList的 - 因爲我創建的DAO類中的一個匿名實現ProxyList,而這被退回放在標準中,這意味着StringResourceDAO也必須被序列化。

通過將ListList替換爲List.stream.filter.collect,它解決了問題。

(雖然我還是不明白它爲什麼在一塊麪板上工作,但不是另一塊)

相關問題