フォームを送信しようとすると、次の検証エラーが発生します。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;
}
2 つのテーブルの関係は、複数のDocumentRevisionが同じDocumentNumberを持つことができますが、 1 つのDocumentRevisionが持つことができるDocumentNumberは 1 つだけです。
ご協力ありがとうございました
/D
編集
私はSpring 3.0とHibernate 3を使用しています。これは、コントローラーと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 のゲッターが値を取得しないのはなぜですか?
編集 4
retrieveDocumentNumber(text) メソッド:
public Document retrieveDocumentNumber(String text){
return (Document) this.sessionFactory.getCurrentSession().get(Document.class, text);
}