【问题标题】:JSF: Conversion Error setting value '<some string>' for 'null Converter'JSF:“空转换器”的转换错误设置值“<某些字符串>”
【发布时间】:2012-05-09 16:28:16
【问题描述】:

在我认为非常简单的情况下,我收到了 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 字段。就我而言,应该不需要转换,所以我不应该收到我看到的错误。

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

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

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

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

这对我来说似乎是一个错误,要么是因为我绑定到接口中定义的 getter/setter,要么是因为 getter 标记有 Id 属性。不过,我会欣赏其他人的想法。

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

【问题讨论】:

  • '&lt;some string&gt;' 到底能得到什么? toString() 表示究竟是哪个对象?
  • 对不起,我不清楚...我得到了我在文本框中输入的任何字符串来代替
  • 哦,好吧,只是字面输入的字符串?嗯,那很奇怪。您确定#{userBean.user} 不为空,在提交过程中也没有发生不兼容的更改?首先,在像 getUser() 这样的 getter 中执行 DB 交互工作看起来不正确。
  • 是的,你可能是对的,它可能不是最简洁的设计,但我继承了这段代码,并想在进行更改之前了解它为什么不起作用。尽管设计可能可疑,但我认为它与 getUser() 没有任何关系,就好像我绑定到用户实体上的不同属性一样(请参阅原始问题),它按预期工作。
  • 是的,这是错误消息中出现的字面输入字符串。

标签: jsf jsf-2


【解决方案1】:

据我所知,我认为这是由 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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多