1

私はjsf 2.1、prettyfaces 3.3.3、およびhibernate jpa 3.6.7を使用しています。国ページがあり、コマンドボタンでコメントを送信しようとしています。

国.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

    <f:metadata>
        <f:viewParam name="country" value="#{countryBean2.selectedCountry}" converter="countryConverter"
                     required="true" />
    </f:metadata>

    <h:head>
        <title>Country</title>
    </h:head>

    <h:body>
        <h:form id="form">
            <h:outputText value="#{countryBean2.selectedCountry.countryName}" />
            <br/><br/>
            <h:outputText value="Comment:" />
            <h:inputText value="#{countryBean2.comment}" />
            <br/>
            <h:commandButton value="Send" action="#{countryBean2.sendComment}" />
        </h:form>
    </h:body>
</html>

国コンバーター:

public class CountryConverter implements Converter {
    public static EntityCountry country = new EntityCountry();

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPU");


    @Override
    public EntityCountry getAsObject(FacesContext context, UIComponent component, String value) {
        EntityManager em = emf.createEntityManager();
        Query query = em.createQuery("SELECT c FROM EntityCountry c WHERE c.countryName = :countryName")
                .setParameter("countryName", value);
        country = (EntityCountry) query.getSingleResult();
        return country;
    }


    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        EntityCountry c = (EntityCountry) value;
        return c.getCountryName();
    }

pretty-config.xml:

<pretty-config xmlns="http://ocpsoft.com/prettyfaces/3.3.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://ocpsoft.com/prettyfaces/3.3.0
                                        http://ocpsoft.com/xml/ns/prettyfaces/ocpsoft-pretty-faces-3.3.0.xsd">

    <url-mapping id="home"> 
        <pattern value="/" /> 
        <view-id value="/faces/index.xhtml" />
    </url-mapping>

    <url-mapping id="country">
        <pattern value="/country/#{country}" />
        <view-id value="/faces/country.xhtml" />
    </url-mapping>

</pretty-config>

faces-config.xml のコンバーター構成:

<converter>
    <converter-id>countryConverter</converter-id>
    <converter-for-class>test.EntityCountry</converter-for-class>
    <converter-class>test.CountryConverter</converter-class>
</converter>

最初に localhost:8080/test/country/england ページを開くと、すべてうまくいきます。しかし、コマンドボタン経由でコメントを送信しようとすると、countryConverter の getAsObject メソッドが間違った文字列パラメーター (「test.CountryBean@bd9eff」など) で再度呼び出され、エンティティが見つかりません。

デフォルトの醜い URL (localhost:8080/test/faces/country.xhtml?country=england など) を使用してコメントを送信しようとすると、countryConverter の getAsObject メソッドが true 文字列パラメーターで呼び出され、コメントを正常に送信できます。prettyfaces のバグだと思いますが、きれいな URL を使用したいと考えています。

4

2 に答える 2

1

おそらく、コンバーターをそのEntityCountryタイプにグローバルに登録してみてください。faces-config.xml構成に使用している場合は、次のようなものを使用します。

<converter>
  <converter-for-class>com.myapp.EntityCountry</converter-for-class>
  <converter-class>com.myapp.CountryConverter</converter-class>
</converter>

PrettyFaces のドキュメントから:

PrettyFaces は、参照される Bean プロパティのタイプに登録された JSF コンバーターを自動的に使用して、パス パラメーターを変換することに注意してください。つまり、PrettyFaces はすべての JSF 標準コンバーターと、faces-config.xml の converter-for class 要素 (または @FacesConverter アノテーションの forClass 属性) を使用して特定の型に使用するために手動で登録されたコンバーターをサポートします。

これが機能しない場合は、OcpSoft サポート フォーラムでトピックを開いてください。

http://ocpsoft.org/support/

これが役立つことを願っています。:)

于 2012-10-11T15:42:22.007 に答える
0

「country」という名前の別のマネージド Bean があり、pretty-config.xml に「country」という名前のパターン値があります。

@Named("country")
@SessionScoped
public class CountryBean implements Serializable {
    .......
}

@Named("country") 値を変更すると、正常に機能しています。

于 2012-10-22T11:59:55.923 に答える