【问题标题】:JSF Converter changing option valueJSF 转换器更改选项值
【发布时间】:2012-05-16 19:57:00
【问题描述】:

我有一个转换器,它正在改变我所有选项的值:

当我第一次创建selectOneMenu 我有这个html

<select name="j_idt14:j_idt20" size="1">
        <option value="2" selected="selected">Infantil</option> //value="2"
    <option value="6">Lançamento Inverno</option>
    <option value="5">Lançamento Verão 2</option>
    <option value="4">Lançamento Preview 1</option>
    <option value="3">Feminina</option>
    <option value="7">Masculina</option>//value="7"
</select>

当我提交我的表单时,它会调用转换器并将其转换为对象,它会弄乱我的值(id),它在第一个和最后一个结果上大多重复相同的id

<select name="j_idt14:j_idt20" size="1">
    <option value="2" selected="selected">Infantil</option>//value="2"
    <option value="6">Lançamento Inverno</option>
    <option value="5">Lançamento Verão 2</option>
    <option value="4">Lançamento Preview 1</option>
    <option value="3">Feminina</option>
    <option value="2">Masculina</option>//value="2" ?
</select>

这是我的converter

@FacesConverter(value = "SubGroup")
public class SubGroup implements Converter
{
    private static ProductSubgroupVO productSubgroupVO   = new ProductSubgroupVO();

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        productSubgroupVO.setId(Integer.valueOf(value));
        productSubgroupVO = (ProductSubgroupVO) new ProductSubgroupBO().getProductSubgroup(productSubgroupVO).toArray()[0];
        return (ProductSubgroupVO) productSubgroupVO;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        productSubgroupVO = (ProductSubgroupVO) value;
        String teste = String.valueOf(productSubgroupVO.getId());
        return teste;
    }
}

我注意到了一些事情,但我不知道这是否是 converter 的正确行为,每次调用 getAsObject 时,最后都会再次调用 getAsString

【问题讨论】:

  • 这表示getAsString() 已损坏。如果您显示您的转换器逻辑,我们也许可以指出错误。

标签: jsf converter


【解决方案1】:

您的productSubgroupVO 被声明为static,因此在所有 转换器实例和线程之间共享。这不是线程安全的。删除它并仅在方法本地范围内声明它。

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
    ProductSubgroupVO productSubgroupVO = new ProductSubgroupVO();
    productSubgroupVO.setId(Integer.valueOf(value));
    return (ProductSubgroupVO) new ProductSubgroupBO().getProductSubgroup(productSubgroupVO).toArray()[0]
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
    ProductSubgroupVO productSubgroupVO = (ProductSubgroupVO) value;
    return String.valueOf(productSubgroupVO.getId());
}

【讨论】:

  • getAsObject 是否可以返回列表?我在ProductVO 上的属性收到一个列表,我的HTML 上有一个selectManyMenu
  • 不,这不是必需的,转换器应用于列表的每个项目。所以你可以使用相同的转换器。我知道在每次转换时调用服务/DAO 可能是不可取的,然后您可能会发现 showcase-omnifaces.rhcloud.com/showcase/converters/… 很有用。
  • 如果我错了,请纠正我,返回的对象设置在:&lt;h:selectManyMenu value="#{productController.productVO.colors}" 上?记住我的productVO.colorsList
  • 是的,没错。 JSF 只会将转换器应用于列表的每一项。
  • 所以它会自动使用从converter返回的对象执行colors.add()
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多