1

setPropertyActionListenerを使用して列挙型プロパティを設定しようとしていますが、その方法がわかりません。エンティティは次のとおりです。

@Entity
public class Invoice {
    public enum InvoiceStatus { ACTIVE, CANCELED }

        ...

        @Enumerated(EnumType.STRING)
    private InvoiceStatus status;

        ...

        public InvoiceStatus getStatus() {
        return status;
    }


    public void setStatus(InvoiceStatus status) {
        this.status = status;
    }

これが、setPropertyActionListenerを使用してステータスをACTIVEに設定するためのコマンドボタンです。

   ...

  <h:form id="invoiceCreatedSuccessfully">
        <p:dialog header="#{msg['title.success']}" widgetVar="invoiceCreatedSuccessfullyDialog" resizable="false" showEffect="fade" hideEffect="fade">  
            <h:panelGrid columns="2" rows="3" style="margin-bottom: 10px">  
                <h:outputText value="#{msg['message.invoiceCreatedSuccessfully']}" />
            </h:panelGrid>  
            <p:commandButton value="#{msg['label.acknowledged']}" actionListener="#{invoiceManager.reload}" action="viewInvoices">
                <f:setPropertyActionListener target="#{invoiceManager.invoice.status}" value="ACTIVE" />
            </p:commandButton>
        </p:dialog>
    </h:form>

エラーは報告されませんが、DBのフィールド「ステータス」は設定されていません。誰かが理由を教えてもらえますか?

4

1 に答える 1

0

文字列は EL の Enum に直接変換されません。faces -configでカスタム変換する必要があります。jsf には 1 つの enum コンバーターがあります。

<converter>
  <converter-for-class>java.lang.Enum</converter-for-class>
  <converter-class>javax.faces.convert.EnumConverter</converter-class>
</converter>

EnumConverter のソース コードを調べると、コンバーターで targetClass が使用可能な場合にのみ機能するようです。

したがって、 enum で動作するように拡張する必要があります。

public class MyEnumConverter extends EnumConverter {
  public MyEnumConverter () {
    super(MyEnum.class);
  }
}

<converter>
  <converter-id>MyEnum</converter-id>
  <converter-class>com.test.MyEnumConverter</converter-class>
</converter>

コンポーネントに追加<f:converter converterId="MyEnum"/>します。

多くの列挙型があり、物事を簡単にするために、オムニフェイスを調べることができますhttp://showcase.omnifaces.org/converters/GenericEnumConverter

于 2013-03-22T14:10:20.130 に答える