gpt4 book ai didi

java - JSF 列表转换器

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:55 24 4
gpt4 key购买 nike

如何为 JSF2 中的 A 类项目列表编写转换器?我已经为 A 类编写了一个转换器,但是这些项目使用默认的 toString() 函数显示:“A@hashcode”。

我需要使用转换器而不是支持 bean 方法,以便可以进行验证 (Hibernate Validator)。

更多信息

这是我使用列表的方式:

<h:inputText id="destinations" value="#{rule.destinations}" converter="gr.panayk.vinyls.Destination"/>

#{rule.destinations} 属于 List<Destination>类型。我期待以逗号分隔的已转换目的地列表。

解决方案

我附上了 BalusC 提出的 List 转换器。

@FacesConverter(value="gr.panayk.vinyls.converter.DestinationList")
public class DestinationListConverter implements Converter
{
@Override
public Object getAsObject(final FacesContext context, final UIComponent component, final String values)
{
final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

final List<Destination> result = new ArrayList<Destination>();
for (String value : values.split(",", -1))
{
final String trimmedValue = value.trim();

final Set<ConstraintViolation<Destination>> violations = validator.validateValue(Destination.class, "data", trimmedValue);
if (!violations.isEmpty())
{
throw new ConverterException(new FacesMessage(violations.iterator().next().getMessage()));
}

result.add(new Destination(trimmedValue));
}

final Set<ConstraintViolation<Rule>> violations = validator.validateValue(Rule.class, "destinations", result);
if (!violations.isEmpty())
{
throw new ConverterException(new FacesMessage(violations.iterator().next().getMessage()));
}

return result;
}

@Override
public String getAsString(final FacesContext context, final UIComponent component, final Object value)
{
if (value instanceof List<?>)
{
final StringBuffer result = new StringBuffer();

final List<?> list = (List<?>) value;

for (int i = 0; i < list.size()-1; i++)
{
if (list.get(i) instanceof Destination)
{
result.append(((Destination) list.get(i)).getData());
result.append(", ");
}
else
{
throw new IllegalArgumentException( "Cannot convert " + value + " object to Destination in DestinationConverter." );
}
}

if (!list.isEmpty())
{
if (list.get(list.size()-1) instanceof Destination)
{
result.append(((Destination) list.get(list.size()-1)).getData());
}
else
{
throw new IllegalArgumentException( "Cannot convert " + value + " object to Destination in DestinationConverter." );
}
}

return result.toString();
}
else
{
throw new IllegalArgumentException( "Cannot convert " + value + " object to List in DestinationConverter." );
}
}
}

最佳答案

I have written a converter for class A, but the items show up using the default toString() function: "A@hashcode".

如果您没有在组件上显式声明转换器,就会发生这种情况。例如 <h:selectManyCheckbox><h:selectManyListbox>显式声明转换器是强制性的,因为所有 JSF/EL 都知道该值的类型是 List , 不是 List<A> (通用类型在运行时丢失)。如果您不声明转换器,则这些值将被视为 String (因为这是 HTML 输出和 HTTP 请求参数值的默认值)。

例如

<h:selectManyCheckbox converter="aConverter">

@FacesConverter(value="aConverter", forClass=A.class)
public class AConverter implements Converter {

// ...

}

当您使用像 <h:selectOneMenu> 这样的单项输入时,没有必要明确声明上述转换器作为 forClass无论如何都会匹配它。

关于java - JSF 列表转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7626015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com