我正在处理一个应用程序而且我在这个应用程序中使用了JSF,我编写了一个实现此接口JSF javax.faces.convert
的Java类,并且还覆盖了Converter的方法getAsString
,这里是Java这种方法的文件:
java.lang.String getAsString(FacesContext context,
UIComponent component,
java.lang.Object value)
但有时候,这里的值是Null
,有时效果很好,
有人知道为什么这个值在这里为空?如何防止它发生?
答案 0 :(得分:3)
如果模型值为null
,则为null
。例如,
public class SomeBean {
private SomeObject someObject;
// Let's assume, someObject is never initialized and defaults to null.
}
如果您使用
<h:outputText value="#{someBean.someObject}" converter="someConverter" />
然后将使用getAsString()
值调用null
。
另外,如果您使用例如
<h:selectOneMenu ... converter="someConverter">
<f:selectItem itemValue="#{null}" itemLabel="Please select ..." />
<f:selectItems value="#{data.availableItems}" />
</h:selectOneMenu>
然后getAsString()
将使用“{select} ...”项目的null
值进行调用。
如果您正面临NullPointerException
,那么它实际上是您自己的转换器实施中的错误。您无法阻止提供的value
成为null
。更重要的是,javadoc which you apparently already found yourself还明确告诉模型对象值可能为null。
value
- 要转换的模型对象值(可能是null
)
你应该自己检查一下。以下是转换器对于虚构User
实体应该如何显示的典型示例:
@Override
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
if (submittedValue == null || submittedValue.isEmpty()) {
return null;
}
try {
return userService.find(Long.valueOf(submittedValue));
} catch (NumberFormatException e) {
throw new ConverterException(new FacesMessage(String.format("%s is not a valid User ID", submittedValue)), e);
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
if (modelValue == null) {
return "";
}
if (modelValue instanceof User) {
return String.valueOf(((User) modelValue).getId());
} else {
throw new ConverterException(new FacesMessage(String.format("%s is not a valid User", modelValue)), e);
}
}
答案 1 :(得分:-1)
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o)
{
if (o == null)
{
return "";
}
Value p = (Value) o;
if (p.getId() != null)
{
return p.getId().toString();
}
return (p.toString());
}