【发布时间】:2012-05-17 02:22:29
【问题描述】:
我在尝试提交表单时收到以下验证错误。使用 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只能有一个文件编号
感谢您的帮助
/D
编辑
我正在使用 spring 3.0 和 hibernate 3。Here 是我最近的一个线程,其中包括控制器和 jsp 页面。
编辑 2
这是应该将 document_number 保存到 DocumentRevision 中的 DAO 实现方法
public void saveDocumentRevision(DocumentRevision documentRevision) {
this.sessionFactory.getCurrentSession().save(documentRevision);
}
编辑 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";
}
更新
我已将以下内容添加到我的控制器中:
/**
* 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 中的 getter 没有得到值?
编辑 4
retrieveDocumentNumber(text) 方法:
public Document retrieveDocumentNumber(String text){
return (Document) this.sessionFactory.getCurrentSession().get(Document.class, text);
}
【问题讨论】:
-
你说的是哪种下拉框?您使用的框架是什么?
-
@rolve 很抱歉没有提供该信息。请看我的编辑
-
我认为问题不在于 ORM 映射。根据错误消息,有些东西试图将字符串放入
Document.document_number。执行此操作的代码在哪里? -
@rolve 我添加了 DAO 方法,该方法应该使用从保管箱中选择的 document_number 保存新的 documentRevision
-
调用DAO方法时,
DocumentRevision对象已经更新了,对吧?我认为错误发生在此之前,当框架尝试设置document_number字段时。
标签: java spring hibernate orm annotations