javax.el.PropretyNotWritableException:类Article没有可写属性'id'

时间:2013-11-16 23:41:06

标签: jsf jsf-2 primefaces el

我有文章DTO(Article.java;代码摘录)

public class Article {

private int id;

public Article() {
    this.id = 0;
}

public Integer getId() {
    return id;
}

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

我有一个用于编辑文章的视图模板(edit_article.xhtml;代码摘录):

            <h:form id="article_form">
                <p:messages id="messages"/>
                <h:panelGrid columns="2">
                    <h:outputText value="" />
                    <h:inputHidden id="articleId" value="#{hqArticleView.article.id}" converter="javax.faces.Integer" />

                </h:panelGrid>
            </h:form>

我有一个视图支持bean(HqArticleView.java;代码摘录):

@Named("hqArticleView")
@RequestScoped
public class HqArticleView implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private Logger log;

@Inject
private IArticleService articleService;

private Article article;
private List<Article> articles;
private Map<String, String> requestParams;

@PostConstruct
private void init() {
    log = LoggerFactory.getLogger(getClass());

    requestParams = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();

    article = new Article();
    article.setPublish(true);

    if (requestParams.containsKey("id")) {
        article.setId(Integer.parseInt(requestParams.get("id")));
        article = articleService.getArticle(article);
    }
}

public Article getArticle() {
    return article;
}

public void setArticle(Article article) {
    this.article = article;
}

public List<Article> getArticles() {
    articles = articleService.getAll();
    Collections.reverse(articles);
    return articles;
}

public void save() {
    log.debug("save pressed");
}

public void edit(Article article) {
    log.debug("edit pressed | id=" + article.getId());
}

public void delete(Article article) {
    log.debug("delete pressed | id=" + article.getId());
}
}

问题是:我尝试访问该视图我收到错误:类文章没有可写属性&#39; id&#39;。 文章中的所有其他字段都正确处理,只有id是一个问题。 奇怪的是,当我在bean中包装了Article对象的id getter和setter:

public void setId(int id){
    this.article.setId(id);
}

public int getId(){
    return this.article.getId();
}

然后它完美地运作。我错过了什么?

2 个答案:

答案 0 :(得分:20)

在检查属性类型以进行读取时,EL会查看getter的返回类型:

public Integer getId() {
    return id;
}

因此属于Integer类型。当EL需要写入更改后的值时,EL期望一个setter采用相同的类型:

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

但是,Article课程中不存在此类设置器。相反,你是一个拿着int的制定者。这正是EL投掷PropertyNotWritableException的原因。这意味着它无法找到完全相同类型的匹配setter。通过在设置器中使用Integer而不是int来相应地修复它(或者,在这种特殊情况下,通过在getter中使用int而不是Integer更好)。

当你在控制器中爆炸模型时(顺便说一下,糟糕的做法)它是有效的,因为getter和setter相互匹配。

答案 1 :(得分:0)

有时是变量名的问题,所以需要尝试另一个名称来解决这个问题!