当我尝试提交表单时,我收到以下验证错误。使用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和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);
}
答案 0 :(得分:3)
Spring WebDataBinder无法将String document_number
转换为Document实例
填充documentRevision模型属性。你有两个职位:
使用可以处理转化的WebDataBinder
初始化PropertyEditor
。最直接,但仅适用于此控制器。
注册Converter<String, Document>
如果选择第一个,请使用@InitBinder
注释注释控制器方法并注册
属性编辑器。好像你只需要通过document_number从数据库中获取文档。请参阅参考文档中的Customizing WebDataBinder initatization。
修改强>
将文档映射到Ids Strings或从Ids Strings映射文档的属性编辑器示例。
/**
* 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
。