我有一篇文章 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());
}
}
问题是:我尝试访问视图时收到错误:类 Article 没有可写属性“id”。
文章中的所有其他字段均已正确处理,只有 id 是问题。
奇怪的是,当我将 Article 对象的 id getter 和 setter 包装在 bean 中时:
public void setId(int id){
this.article.setId(id);
}
public int getId(){
return this.article.getId();
}
然后它就完美地工作了。我缺少什么?
当检查要读取的属性类型时,EL 会查看 getter 的返回类型:
public Integer getId() {
return id;
}
这是这样的类型Integer
。当 EL 需要写入更改后的值时,EL 期望使用相同类型的 setter:
public void setId(Integer id) {
this.id = id;
}
但是,您的中不存在这样的设置器Article
班级。相反,你有一个二传手int
。这正是 EL 抛出的原因PropertyNotWritableException
。这意味着它找不到采用完全相同类型的匹配设置器。通过使用相应地修复它Integer
代替int
在设置器中(或者,在这种特殊情况下更好,通过使用int
代替Integer
在吸气剂中)。
当您在控制器中分解模型时(顺便说一句,这是不好的做法),它起作用是因为 getter 和 setter 彼此匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)