【问题标题】:How to implement a good converter for JSF? [duplicate]如何为 JSF 实现一个好的转换器? [复制]
【发布时间】: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


【解决方案1】:

您所做的正是我的转换器所做的一切。

我认为您缺少的是,是的,您使用“对象”加载了 AutoComplete,但是如果您在浏览器中查看,您将看到的只是代表 ID 的字符串值,例如“45、67、93”。

当您从浏览器提交表单时,发送的所有内容都是像“43”这样的字符串。因此,在您的服务器端,您需要一个转换器将字符串 43 转换回真实对象。它不一定是 DAO……对于我的一些项目,如果对象列表不经常更改,我会使用 ApplicationScoped 缓存。但对我来说,你做的都是对的。

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 2016-10-26
    • 1970-01-01
    • 2011-05-15
    • 2017-03-09
    • 1970-01-01
    • 2012-12-06
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多