这个问题已经在这里有一个答案:
我想提高我的转换器的使用,用于自动完成对象为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>
这些组件工作得很好,但我有点混乱,我为什么要使用数据库来检索其键现实,即使我已经加载到自动完成对象的完整列表。我错了的东西?
你在做什么我的所有转换器做。
我认为你缺少的是,是的,你用“对象”装你自动完成,但如果你在浏览器看您能看到的是字符串值,如“45,67,93”代表的ID。
当你形成了从浏览器提交发送所有像“43”的字符串。所以,在你的服务器端,您需要一个转换器把该字符串43回一个真正的对象。这并不一定是一个DAO ......对于我的一些项目我使用ApplicationScoped缓存如果对象的列表不经常更改。不过,我觉得你在做所有正确的事情。