1

我发现了一些尝试使用视图参数设置值的奇怪行为。下面的代码不起作用...在使用 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>
4

1 回答 1

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 的提示!

于 2012-05-17T20:16:37.927 回答