嵌套异常是java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为所需类型

dli*_*x90 6 java orm spring annotations hibernate

我尝试提交表单时收到以下验证错误.使用Document.java中的值填充的下拉框会出现此错误:

Failed to convert property value of type java.lang.String to required type 
testapp.domain.Document for property document_number; nested exception is 
java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] 
to required type [testapp.domain.Document] for property document_number: no matching 
editors or conversion strategy found
Run Code Online (Sandbox Code Playgroud)

我的映射有问题吗?

Document.java映射

    @OneToMany(mappedBy="document_number", cascade = CascadeType.ALL)
private Set<DocumentRevision> documentRevisions;

public void setDocumentRevisions(Set<DocumentRevision> documentRevisions){
    this.documentRevisions = documentRevisions;
}
Run Code Online (Sandbox Code Playgroud)

DocumentRevision.java映射

    @ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="DOCUMENT_NUMBER")
private Document document_number; 

public void setDocument_number(Document document_number){
    this.document_number = document_number;
}

public Document getDocument_number(){
    return document_number;
}
Run Code Online (Sandbox Code Playgroud)

两个表之间的关系是几个DocumentRevisions可以具有相同的DocumentNumber但是一个DocumentRevision只能有一个DocumentNumber

谢谢您的帮助

/ d

编辑

我使用的是Spring 3.0和hibernate 3. 是我最近的一个主题,包括控制器和jsp页面.

编辑2

这是DAO实现方法,它应该将document_number保存到DocumentRevision中

    public void saveDocumentRevision(DocumentRevision documentRevision) {
    this.sessionFactory.getCurrentSession().save(documentRevision); 
}
Run Code Online (Sandbox Code Playgroud)

编辑3

我相信这是应该记录document_number的代码的一部分.我是否必须在.POST方法中的某处使用"documentNumberList"?在那种情况下我该怎么做?

控制器的一部分:

@RequestMapping(value="/add", method=RequestMethod.GET)
public String getDocumentRevision(Model model) {
DocumentRevision documentRevision = new DocumentRevision();
model.addAttribute("documentRevisionAttribute", documentRevision);
model.addAttribute("documentNumberList", documentService.retrieveAllDocumentNumbers());

return "new-documnent-revision";
}


@RequestMapping(value="/add", method=RequestMethod.POST)
public String postDocumentRevision(@ModelAttribute("documentRevisionAttribute") @Valid DocumentRevision documentRevision, BindingResult result) {

if(result.hasErrors()){
    return "new-document-revision";
}

documentRevisionService.createDocumentRevision(documentRevision);
return "redirect:/testapp/document-revision/list";  
}
Run Code Online (Sandbox Code Playgroud)

更新

我已将以下内容添加到我的控制器中:

    /**
 * Property editor to map Documents from documents IDs.
 */

 class DocumentPropertyEditor extends PropertyEditorSupport {

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        Document value =  documentService.retrieveDocumentNumber(text);
        setValue(value);
    }

    @Override
    public String getAsText() {
        Document d = (Document) getValue();
        return d != null ? String.valueOf(d.getDocumentNumber()) : "";
    }

}


@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Document.class, new DocumentPropertyEditor());
}
Run Code Online (Sandbox Code Playgroud)

我现在得到一个NullPointerException:

java.lang.NullPointerException
testapp.controller.DocumentRevisionController$DocumentPropertyEditor.getAsText(DocumentRevisionController.java:59)
Run Code Online (Sandbox Code Playgroud)

为什么PropertyEditor中的getter不能获得值?

编辑4

retrieveDocumentNumber(text)方法:

    public Document retrieveDocumentNumber(String text){
    return (Document) this.sessionFactory.getCurrentSession().get(Document.class, text);
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*tin 4

String document_number填充 documentRevision 模型属性时,Spring WebDataBinder 无法将 转换为 Document 实例。你有两种选择:

  • WebDataBinder使用PropertyEditor可以处理转换的a 来初始化。最直接,但仅适用于此控制器。

  • 注册一个Converter<String, Document>

如果选择第一个,请使用注释来注释控制器方法@InitBinder并注册属性编辑器。似乎您只需要按 document_number 从数据库中获取文档即可。请参阅参考文档上的自定义 WebDataBinder 初始化。

编辑

将文档映射到 Id 字符串或从 Id 字符串映射到文档的属性编辑器示例。

/**
 * Property editor to map Documents from documents IDs.
 */
 class DocumentPropertyEditor extends PropertyEditorSupport {

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        Long id = Long.parseLong(text);
        Document value = id == 0 ? null : documentService.get(id);
        setValue(value);
    }

    @Override
    public String getAsText() {
        Document d = (Document) getValue();
        return d != null ? String.valueOf(d.getId()) : "";
    }
}
Run Code Online (Sandbox Code Playgroud)

对于第二种方法,请查看验证、数据绑定和类型转换,了解如何Converter在 Spring 中创建和注册 a ConversionService