繁体   English   中英

JSF:转换错误设置值&#39; <some string> &#39;代表&#39;null Converter&#39;

[英]JSF: Conversion Error setting value '<some string>' for 'null Converter'

我收到一个我认为是非常简单的场景的null转换器错误:

<!-- 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字段。 就我而言,应该不需要进行转换,所以我不应该得到我看到的错误。

有趣的是,如果我将以下getter和setter添加到我的实体中:

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

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

然后对我的视图进行必要的更改以绑定到tmpId而不是id,一切按预期进行。

对我来说,这似乎是一个错误,要么与我绑定到接口中定义的getter / setter或通用接口中定义的事实有关,要么是因为getter被标记为Id属性。 但是,我将感谢其他人的想法。

顺便说一句,我继承了这种设计,并且不特别喜欢它,因此我可能最终只能对其进行重构以引入新的用户名属性,而不是尝试使用Id。

据我所知,我认为这是由BeanELResolver中一个晦涩的错误引起的,该错误用于获取绑定到的属性的类型-而不是返回String,而是返回Serializable,因为它没有转换器,因此错误我看到了

它不是特别优雅,但是我通过在userBean中添加userId属性,然后在我的视图中绑定了该属性,而不是在用户实体上绑定了Id属性,从而解决了这一问题。 然后,在保存时,我使用该值在实体上手动设置ID:

<!-- My New 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.userId}"
                     styleClass="text" />
        <rich:message id="errorUsername" for="txtUsername"/>
    </div>
    <!--  Other fields omitted for clarity  -->

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

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    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;
    }

    public void saveUser() {
        if (user.getId() == null) {
            user.setId(userId);
        }
        // Actual saving omitted for brevity
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM