转换错误:设置'null converter'的值

时间:2014-12-07 17:01:51

标签: jsf jsf-2

好的,所以我收到了这个错误,发现没有适用于我的解决方案(我尝试使用注释,例如@FacesConverter@Named而不是@ManagedBean等等。)如果有人可以指出我正确的方向,这将是非常棒的。 BalusC提到,这个特殊的错误意味着转换器无法找到,但转换器正在被调用,正如我在JBoss的日志消息中看到的那样(参见下面的转换器代码中的log.info调用)。至少我不再从转换器中获取NullPointerExceptions(虽然我无法重现原因)。我对JSF感到有点沮丧,但我确定这是我的错,而且我监督了一些明显的事情?

代码应该足够简单,我想通过selectManyCheckbox为链接实体(newLink.tags)设置零个,一个或多个标签:

这是我的XHTML表单:

<h:form id="create_link_form" rendered="#{authController.loggedIn}">
    <h3>Enter a new Link here:</h3>`
    <h:panelGrid columns="3" columnClasses="titleCell">
        <h:outputLabel for="name" value="Name:"/>
        <h:inputText id="name" value="#{newLink.name}"/>
        <p:message for="name" errorClass="invalid"/>

        <h:outputLabel for="url" value="URL:"/>
        <h:inputText id="url" value="#{newLink.url}"/>
        <p:message for="url" errorClass="invalid"/>

        <h:outputLabel for="description" value="Description:"/>
        <h:inputText id="description" value="#{newLink.description}"/>
        <p:message for="description" errorClass="invalid"/>

        <h:outputLabel for="shared" value="Shared?:"/>
        <h:selectBooleanCheckbox id="shared" label="Shared?:" value="#{newLink.shared}"/>
        <p:message for="shared" errorClass="invalid"/>

    </h:panelGrid>

        <h:outputLabel for="tags" value="Tags:"/>
        <h:selectManyCheckbox label="Tags:" id="tags" value="#{newLink.tags}" converter="#{tagConverter}">
            <f:selectItems value="#{tags}" var="tag" itemLabel="#{tag.name}" itemValue="#{tag}"/>
        </h:selectManyCheckbox>

    <h:inputHidden id="owner" value="#{newLink.owner}" name="{authController.loggedInUserName}"/>
    <p>
        <h:panelGrid columns="2">
            <h:commandButton id="create" action="#{linkController.create}" value="Create"
                             styleClass="create">
            </h:commandButton>
            <p:messages styleClass="messages" autoUpdate="true" globalOnly="true"/>
        </h:panelGrid>
    </p>
</h:form>

这是我的转换器:

@RequestScoped
@ManagedBean
public class TagConverter implements Converter {

@Inject
private Logger log;

@Inject
private TagService tagService;

@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {

    if (value != null && value.trim().length() > 0) {
        try {
            log.info("TTagConverter.getAsObject() => having " + value);
            Long id = Long.parseLong(value);
            Tag tag = tagService.getTagWithId(id);
            log.info("TagConverter.getAsObject() => Tag converted: " + tag);
            return tag;
        } catch (NumberFormatException e) {
            throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid tag."));
        }
    } else {
        return null;
    }
}

@Override
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
    if (object != null) {
        if (object instanceof Tag) {
            Long id = ((Tag) object).getId();
            return id.toString();
        } else {
            throw new ConverterException(new FacesMessage("There was an Object type error for a "
                    + object.getClass() + " in getAsString(" + object + ")"));
        }
    } else {
        return null;
    }
}
}

1 个答案:

答案 0 :(得分:0)

您的托管bean不应该实现它。

创建类并实现转换器。

@FacesConverter("myConverter")
public class MyConverter implements Converter{
...
}

在你的脸上

<h:selectManyCheckbox label="Tags:" id="tags" value="#{newLink.tags}">
            <f:selectItems value="#{tags}" var="tag" itemLabel="#{tag.name}" itemValue="#{tag}"/>
            <f:converter converterId="myConverter" />
</h:selectManyCheckbox>

是否清楚?