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 コンバーターをインストールしようとします。示されたメソッドのコメントを外すとコードが機能する理由は、「id」プロパティのプロパティ メソッドjavax.faces.Longの明示的な宣言に基づいて、コンバータが必要であることを JSF が適切に検出するためです。Long

ヒントをくれた@Damianに感謝します!

于 2012-05-17T20:16:37.927 に答える