2

非常に単純なシナリオだと思っていたものに対して、null Converter エラーが発生しています。

<!-- My View -->
<ui:composition template="/template/template_v1.xhtml"
            xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html">
<!-- Simplified for clarity -->    
<h:form>
    <div class="block-panel customer-data">
        <h:outputLabel for="txtUsername">Username:</h:outputLabel>
        <h:inputText id="txtUsername" name="Username" 
                     value="#{userBean.user.id}"
                     styleClass="text" />
        <rich:message id="errorUsername" for="txtUsername"/>
    </div>
    <!--  Other fields omitted for clarity  -->
</h:form>

/* The User Bean - simplified */
@ManagedBean
@ViewScoped
public class UserBean implements Serializable {
    private User user;

    public User getUser() {
        // Contains logic for reading a user from the database or creating a new
        // user object
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

/* The user Entity - Simplified */
@Entity
@Table(name = "user")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "user_type", discriminatorType = DiscriminatorType.STRING)
public class User implements IEntity<String>, Serializable {
private static final long serialVersionUID = 1L;

    private String id;

    @Id
    @Column(name = "username", length = 50)
    @NotNull(message = "{userIdMandatory}")
    @Size(max = 50)
    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

/* The IEntity interface */
public interface IEntity<ID extends Serializable> {
    ID getId();
    void setId(final ID pId);
}

したがって、基本的には、ユーザー エンティティの文字列プロパティを inputText フィールドにバインドしようとしています。私に関する限り、変換の必要はないはずなので、私が見ているエラーは発生しないはずです。

興味深いことに、次のゲッターとセッターをエンティティに追加すると:

public String getTmpId() {
    return this.id;
}

public void setTmpId(String id) {
    this.id = id;
}

次に、ビューに必要な変更を加えて、id ではなく tmpId にバインドすると、すべてが期待どおりに機能します。

これは、インターフェイスで定義されたゲッター/セッターにバインドしている、ジェネリック インターフェイスで定義されている、またはゲッターが Id 属性でマークされているため、バグのように思えます。ただし、他の人のアイデアをいただければ幸いです。

余談ですが、私はこのデザインを継承しており、特に好きではないので、ID を使用しようとするのではなく、新しいユーザー名プロパティを導入するためにリファクタリングすることになるかもしれません。

4

1 に答える 1