1

コンバーターがあり、すべてのオプションの値を変更しています:

私が最初に作成したとき、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;
    }
}

私は何かに気づきましたが、それが a の正しい動作であるかどうかはわかりません。が呼び出されるconverterたびgetAsObjectに、最後に再度呼び出さgetAsStringれます。

4

1 に答える 1

1

YourproductSubgroupVOは宣言されているため、すべてのコンバーター インスタンスとスレッド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());
}
于 2012-05-16T21:14:31.727 に答える