6

フォームを送信しようとすると、次の検証エラーが発生します。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);
}
4

1 に答える 1

3

String document_numberdocumentRevision モデル属性を設定するときに、Spring WebDataBinder が Document インスタンスへの変換に失敗します。次の 2 つの可能性があります。

  • 変換を処理できるWebDataBinderで を初期化します。PropertyEditor最も直接的ですが、このコントローラーでのみ機能します。

  • 登録するConverter<String, Document>

最初を選択した場合は、コントローラ メソッドに@InitBinder注釈を付けて、プロパティ エディタを登録します。document_number でデータベースからドキュメントを取得するだけでよいようです。リファレンス ドキュメントの WebDataBinder 初期化のカスタマイズを参照してください。

編集

ドキュメントを 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()) : "";
    }
}

2 番目のアプローチについては、検証、データ バインディング、型変換Converterを参照して、Spring でa を作成および登録する方法を確認してくださいConversionService

于 2012-05-09T09:00:36.513 に答える