Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF javax.faces.convert转换器getAsString对象null_Jsf_Jsf 2_Null_Converter - Fatal编程技术网

JSF javax.faces.convert转换器getAsString对象null

JSF 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

我正在开发一个应用程序,我在这个应用程序中使用了JSF,我编写了一个Java类,它实现了这个接口JSF
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);
    }
}