访问使用泛型定义的方法时,JSF视图参数失败

时间:2012-05-17 11:13:15

标签: jsf-2

我发现了一些尝试使用view参数设置值的奇怪行为。下面的代码不起作用...在使用view参数提交表单时,未设置id值。但是,如果从getId和setId方法中删除注释,则正确设置id值。在访问泛型时,JSF EL是否存在一些问题,或者我做了一些非常错误的事情?任何人都可以解释这种行为吗?

有趣的是,我没有收到任何例外......价值根本没有设定。实际上,抽象类中的setId方法甚至都没有被调用。

public abstract class AbstractBusinessObjectAction<E, ID extends    Serializable>  {

  protected abstract BusinessObjectManager<E, ID> getBusinessObjectManager();

  public  ID getId() {
    ID id = getBusinessObjectManager().getId();
    return id;
  }

  public void setId(final ID id) {
    getBusinessObjectManager().setId(id);
  }
}


@Named("configuration")
@ConversationScoped
public class ConfigurationAction extends AbstractBusinessObjectAction<ConfigurationParameter, Long> {

  @Inject
  private ConfigurationParameterManager manager;

  protected BusinessObjectManager<ConfigurationParameter, Long> getBusinessObjectManager() {
    return manager;
  }

//  public Long getId() {
//    Long id = super.getId();
//    return id;
//  }

//  public void setId(Long id) {
//    super.setId(id);
//  }
}

以下是除.xhtml以外的内容:

<f:metadata>
    <f:viewParam id="entityIdParam" name="entityId" value="#{configuration.id}"  />
</f:metadata>

1 个答案:

答案 0 :(得分:0)

添加转换器解决了这个问题。

<f:viewParam id="entityIdParam" name="entityId" value="#{configuration.id}" >
  <f:converter converterId="javax.faces.Long" />
</f:viewParam>

据我所知,这就是原因:

因为抽象类中的id属性类型为ID extends Serializable,所以JSF尝试安装不存在的Serializable转换器。当我取消注释所指示的方法时,代码工作的原因是JSF正确地检测到它需要基于{id}属性的属性方法的javax.faces.Long的显式声明的Long转换器。

感谢@Damian提示!