gpt4 book ai didi

java - Wicket SpringBean 在一个面板上生成 NotSerializedException,但在另一个面板上则不会

转载 作者:行者123 更新时间:2023-12-02 02:58:12 24 4
gpt4 key购买 nike

我有一个 spring bean DAO 类,它有一个方法reverseLookup(),它返回一个List 。我将此 bean 注入(inject)到 2 个 wicket 组件中,并在每个组件上的 ajax 调用中调用相同的方法。

在第一个面板中,它工作正常,没有任何问题。在第二个面板中,我收到 NotSerializedException。

DAO 类不是可序列化的,但它不应该是可序列化的。我使用 @SpringBean 来注入(inject) bean(并且在这个大型应用程序中使用 @SpringBean 注入(inject)了数十个其他 bean,它们都工作得很好)

在 ajax 调用完成并且页面被序列化之前,该错误不会发生。然后它在每个连续的请求周期都会失败。

我看不出 DAO 类有什么特别之处 - 它没有成员变量,也没有做其他 DAO 类所做的任何特别的事情。我不明白为什么它在一个面板中工作正常,但在另一个面板中却不起作用。

我尝试过在有问题的面板中使成员变量 transient 并使用 Injector,但没有什么区别。

DAO 接口(interface):

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() 包装器 List 实现,允许访问列表属性而无需复制列表内容。 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 内的面板

有人遇到过类似的问题吗?

谢谢

最佳答案

(如果有人遇到类似问题,请发布)

问题是由于 ProxyList - 因为我在 DAO 类中创建了 ProxyList 的匿名实现,并且将其返回以放入条件中,这意味着 StringResourceDAO 也必须进行序列化。

通过用List.stream.filter.collect替换ProxyList,问题就解决了。

(虽然我仍然不明白为什么它适用于一个面板但不适用于另一个面板)

关于java - Wicket SpringBean 在一个面板上生成 NotSerializedException,但在另一个面板上则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42784078/

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