如何为 JSF 实现一个好的转换器?
How to implement a good converter for JSF?
我正在尝试改进转换器的使用,以便将自动完成对象转换为 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();
}
}
这是实体:
@实体
public class 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>
这些组件运行良好,但我有点困惑为什么我应该使用数据库从它的键中检索真实的,即使我已经将完整的对象列表加载到自动完成中。我是不是哪里出错了?
你所做的正是我所有的转换器所做的。
我认为您缺少的是,是的,您使用 "objects" 加载了自动完成功能,但是如果您在浏览器中查看,您将看到的只是代表 ID 的字符串值,例如“45、67、93”。
当您从浏览器提交表单时,发送的所有内容都是一个字符串,如“43”。因此,在您的服务器端,您需要一个转换器来将字符串 43 转换回真实对象。它不一定是 DAO...对于我的一些项目,如果对象列表不经常更改,我使用 ApplicationScoped 缓存。但对我来说,你做的一切都是对的。
我正在尝试改进转换器的使用,以便将自动完成对象转换为 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();
}
}
这是实体:
@实体 public class 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>
这些组件运行良好,但我有点困惑为什么我应该使用数据库从它的键中检索真实的,即使我已经将完整的对象列表加载到自动完成中。我是不是哪里出错了?
你所做的正是我所有的转换器所做的。
我认为您缺少的是,是的,您使用 "objects" 加载了自动完成功能,但是如果您在浏览器中查看,您将看到的只是代表 ID 的字符串值,例如“45、67、93”。
当您从浏览器提交表单时,发送的所有内容都是一个字符串,如“43”。因此,在您的服务器端,您需要一个转换器来将字符串 43 转换回真实对象。它不一定是 DAO...对于我的一些项目,如果对象列表不经常更改,我使用 ApplicationScoped 缓存。但对我来说,你做的一切都是对的。