我试图做一些我认为最基本的情景。
在起始页面上有一个来自数据库的类别列表,在我点击类别后,应该有一个页面,其中包含有关该类别的一些详细信息(可能会打印它的名称和一些产品等)。
我试图做BalusC did on ther blog post
我使用java-ee-7,glasfish 4.1,hibernate 4.3.5
在index.xhtml中我使用参数链接到类别:
<h:link outcome="category.xhtml" value="#{category.name}">
<f:param name="categoryId" value="#{category.id}"/>
</h:link>
使用查询字符串categoryId
参数打印类别。
然后在category.xhtml上我有:
<f:metadata>
<f:viewParam name="categoryId"
value="#{categoryController.category}"
converter="#{categoryConverter}" />
</f:metadata>
<h:body>
Category name:
<h:outputText value="#{categoryController.category.name}" />
<!-- this one prints nothing -->
</h:body>
CategoryController代码如下所示:
@Named
@RequestScoped
public class CategoryController {
private Category category;
public void setCategory(Category category) {
this.category = category;
}
public Category getCategory() {
return category;
}
}
并且转换器看起来像这样:
@Named
@RequestScoped
public class CategoryConverter implements Converter {
@Inject
private CategoryRepository categoryRepository;
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
return categoryRepository.find(Integer.parseInt(s));
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
if (o == null || !(o instanceof Category)) {
return null;
}
return ((Category) o).getId().toString();
}
}
调用了一些仅测试getAsString
方法,但我认为应该有getAsObject
。
语句<h:outputText value="#{categoryController.category.name}" />
不打印任何内容(可能为null)。
我如何在category.xhtml
页面中拥有类别实体?
-
为了说清楚,我让它与像
这样的想法一起工作<h:commandButton action="#{categoryController.showCategory(category)}" />
但这会生成http post
,我想要简单的get
请求。对我而言,只能通过post
访问它才是荒谬的。
如果缺少某些内容,我可以通过github访问它,并在此处删除不必要的代码:https://github.com/Yavin/jsf-entity-convert