转换错误:'空转换器'的设置值

问题描述:

好的,所以我得到这个错误,发现没有解决方案为我工作(我试了很多注释,如@FacesConverter@Named而不是@ManagedBean等)如果有人可以指向我正确的方向,这将是非常棒的。 BalusC提到,这个特殊的错误意味着转换器不能被找到,但是转换器正在被调用,就像我在JBoss的日志消息中看到的(参见下面的转换器代码中的log.info调用)。至少我不再从Converter中获得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; 
    } 
} 
} 

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

创建类和实现转换器。

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

在你的Facelets

<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> 

是否清楚?

+0

感谢,可惜的是没有工作的,它看到的转换器,但现在我得到NullPointerErrors每当我至少选择1标签: 显示java.lang.NullPointerException \t ch.linuxhome.projects.ckLinks.controller.TagConverter.getAsObject(给出TagConverter有趣的是,如果我没有选择一个标签,我仍然会得到“无效转换器”错误,如OP – 2014-12-07 19:05:05

+0

也可以试试这个:@FacesConverter(value =“myConverter”)或者尝试调试哪里你的代码完全失败。或者尝试创建一些非常简单的文本输入转换器,不需要检查null,非常简单。 – hiimjames 2014-12-07 20:30:15

+0

好吧,它现在可以这样工作:仅为Converter类使用@Named。有趣的是不是?看起来NPE来自没有EL-ready或其他... 而且我有一个隐藏字段指向模型的所有者字段,这是造成问题(虽然没有提及缺少转换器) – 2014-12-11 13:55:31