如何为 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 缓存。但对我来说,你做的一切都是对的。