JSF javax.faces.convert转换器getAsString对象null
我正在开发一个应用程序,我在这个应用程序中使用了JSF,我编写了一个Java类,它实现了这个接口JSFJSF javax.faces.convert转换器getAsString对象null,jsf,jsf-2,null,converter,Jsf,Jsf 2,Null,Converter,我正在开发一个应用程序,我在这个应用程序中使用了JSF,我编写了一个Java类,它实现了这个接口JSFjavax.faces.convert,还覆盖了Converter的方法getAsString,下面是这个方法的Java文档: java.lang.String getAsString(FacesContext context, UIComponent component, jav
javax.faces.convert
,还覆盖了Converter的方法getAsString
,下面是这个方法的Java文档:
java.lang.String getAsString(FacesContext context,
UIComponent component,
java.lang.Object value)
但有时,这里的值是Null
,有时工作正常
有人知道为什么这个值在这里是空的吗?如何防止它发生?看一看
如果模型值为
null
,则它将为null
。比如说,
public class SomeBean {
private SomeObject someObject;
// Let's assume, someObject is never initialized and defaults to null.
}
<h:selectOneMenu ... converter="someConverter">
<f:selectItem itemValue="#{null}" itemLabel="Please select ..." />
<f:selectItems value="#{data.availableItems}" />
</h:selectOneMenu>
如果你使用
<h:outputText value="#{someBean.someObject}" converter="someConverter" />
然后将使用“请选择…”项的null
值调用getAsString()
如果您面临的是NullPointerException
,那么它实际上是您自己的转换器实现中的一个bug。您无法阻止提供的值为null
。更重要的是,还显式地告知模型对象值可能为null
值
-要转换的模型对象值(可能是null
)
你应该自己检查一下。下面是一个典型的示例,演示了虚拟用户
实体的转换器外观:
@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);
}
}
发布转换器代码和JSF CodeConverter代码:公共抽象类ValueConverter实现转换器{受保护的抽象值findAsString(字符串s);公共字符串getAsString(FacesContext FacesContext,UIComponent UIComponent,Object o){值p=(值)o;if(p.getId()!=null){返回p.getId().toString();}return(p.toString());}}}我想您传入的对象o有时可能是空的。因为只有你得到零,这种情况何时会发生?这个空对象是怎么来的?你只知道确切的情况。如果对象值为null,则可以返回空字符串。将条件放在getAsString方法中你没有回答这个问题。他得到了空值,所以只有我这样做。OP还问“有人知道为什么这个值在这里是空的吗?”我知道,但对象o值可能是空的。在这里我参考了你的答案,然后我就这样做了。你根本没法回答这个问题。您只是粘贴了一个链接并发布了一些代码,没有用自己的话进一步阐述原因和解决方案。我实际上没有查看链接。
@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);
}
}