【发布时间】:2019-02-03 08:57:34
【问题描述】:
我正在尝试改进转换器的使用,以便将自动完成对象转换为 JSF 项目。这是我的转换器:
@FacesConverter(value = "articleColorConverter", forClass = ArticleColor.class)
public class ArticleColorConverter implements Converter {
private ArticleColorDao articleColorDao;
public ArticleColorConverter() {
super();
try {
InitialContext ic = new InitialContext();
articleColorDao = (ArticleColorDao) ic.lookup("java:module/ArticleColorDao");
} catch (NamingException e) {
e.printStackTrace();
}
}
@Override
public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
try {
Long.valueOf(value);
return articleColorDao.findArticleColorByPk(Long.valueOf(value));
} catch (Exception e) {
return null;
}
}
@Override
public String getAsString(FacesContext ctx, UIComponent component, Object value) {
return value.toString();
}
}
这是一个实体:
@实体 公共类 ArticleColor 实现 Serializable {
@Id
@GeneratedValue
private Long pk;
private String code;
private String description;
private boolean deleted;
这是我的 toString() 方法:
Override
public String toString() {
String result = description;
if (code != null) {
result += " (" + code + ")";
}
return result;
}
最后这是我的自动完成功能:
<p:autoComplete id="acArticleColor"
value="#{createOrderSelectionView.productionOrder.articleColor}"
completeMethod="#{createOrderSelectionView.completeTextArticleColor}"
style="margin-bottom:10px;" var="articleColor"
itemLabel="#{articleColor}" converter="articleColorConverter"
itemValue="#{articleColor.pk}" forceSelection="true">
</p:autoComplete>
这些组件工作得很好,但我有点困惑为什么我应该使用数据库从它的键中检索真实的,即使我已经加载到自动完成对象的完整列表中。我有什么不对吗?
【问题讨论】:
-
这个问题没有重复,因为我要求一种方法来改进你提到的链接的方法!
-
你所做的正是我的转换器所做的。我认为您缺少的是,是的,您使用“对象”加载了 AutoComplete,但是如果您在浏览器中查看,您将看到的都是字符串值,例如代表 ID 的“45、67、93”。当您从浏览器提交表单时,发送的所有内容都是像“43”这样的字符串。因此,在您的服务器端,您需要一个转换器将字符串 43 转换回真实对象。如果对象列表不经常更改,我使用 ApplicationScoped 缓存的某些项目不必是 DAO。但对我来说,你做的都是对的。
-
你的回答很好,非常感谢!我认为它可以设置为真正的答案,并且可以被评为最佳答案!据我所知,在某些情况下,hashcode 应该执行转换操作,使用最近的 JSF 框架,但如果它现在运行良好,对我来说是一件好事!缓存的想法,很不错!
标签: jsf primefaces