尝试提交表单时出现以下验证错误。使用来自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

我的映射有问题吗?

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

public void setDocumentRevisions(Set<DocumentRevision> documentRevisions){
    this.documentRevisions = documentRevisions;
}

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

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

感谢您的帮助

/D

编辑

我正在使用spring 3.0和hibernate3。Here是我最近使用的线程,其中包括 Controller 和jsp页面。

编辑2

这是应该将document_number保存到DocumentRevision中的DAO实现方法
    public void saveDocumentRevision(DocumentRevision documentRevision) {
    this.sessionFactory.getCurrentSession().save(documentRevision);
}

编辑3

我相信这是应该记录document_number的代码部分。我必须在.POST方法中的某处使用“documentNumberList”吗?在这种情况下,我该怎么办?

Controller 的一部分:
@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";
}

更新

我已将以下内容添加到我的 Controller 中:
    /**
 * 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());
}

我现在得到一个NullPointerException:
java.lang.NullPointerException
testapp.controller.DocumentRevisionController$DocumentPropertyEditor.getAsText(DocumentRevisionController.java:59)

为什么PropertyEditor中的 setter/getter 没有得到值?

编辑4

resolveDocumentNumber(text)方法:
    public Document retrieveDocumentNumber(String text){
    return (Document) this.sessionFactory.getCurrentSession().get(Document.class, text);
}

最佳答案

当出现以下情况时,Spring WebDataBinder无法将String document_number转换为Document实例
填充documentRevision模型属性。您有两种可能性:

  • 用可以处理转换的WebDataBinder初始化PropertyEditor。最直接,但仅对此 Controller 有效。
  • 注册一个Converter<String, Document>

  • 如果选择第一个,则使用@InitBinder注释对 Controller 方法进行注释并注册
    属性编辑器。似乎您只需要按document_number从数据库中获取文档。请参阅引用文档上的Customizing WebDataBinder initatization

    编辑

    属性编辑器示例,用于将文档映射到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()) : "";
        }
    }
    

    对于第二种方法,请查看Validation, Data Binding, and Type Conversion以查看
    如何在Spring Converter中创建和注册ConversionService

    09-27 18:22