Преобразование типов работает только для сохранения в базе данных, а не для отображения

Я инициализирую WebDataBinder с помощью PropertyEditor для обработки преобразования строки в объект документа, чтобы его можно было сохранить в базе данных как таковой. (Мое сопоставление Hibernate требует этого). Это прекрасно работает.

Моя проблема заключается в том, что когда я отображаю таблицу DocumentRevision, где documentNumber сохраняется как тип документа, она отображает что-то вроде следующего: testapp.domain.document@1f93466

  • Должен ли я создавать новый PropertyEditor, который преобразует тип документа в строку?
  • Как бы я это сделал? (Был бы признателен пример, так как я видел только обратное, String --> Object)

Я использую Spring 3.0 и Hibernate 3.

Код:

Сопоставление 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.

Часть контроллера:

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

@RequestMapping(value="/list", method=RequestMethod.GET) 
public String getDocumentRevisionList(Model model) {
List<DocumentRevision> documentRevisions = documentRevisionService.retrieveAllDocumentRevisions();
model.addAttribute("documentRevisions", documentRevisions);
return "document-revision";

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

метод полученияНомераДокумента(текст):

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

часть страницы jsp, где отображается список DocumentRevision:

 <c:forEach items="${documentRevisions}" var="documentRevision">
  <tr>
   <td><c:out value="${documentRevision.documentId}"/></td>
   <td><c:out value="${documentRevision.documentNumber}" /></td>
   <td><c:out value="${documentRevision.documentRState}" /></td>
   <td><a href="${addUrl}">Add</a></td>
  </tr>
 </c:forEach>

Спасибо за ваше время и помощь!

/D


person dlinx90    schedule 10.05.2012    source источник


Ответы (1)


Похоже, он вызывает метод toString() по умолчанию. Вы можете переопределить этот метод в классе документа. В этом случае он выведет то, что вы хотите.

person alexey28    schedule 10.05.2012
comment
Спасибо, что исправили проблему - person dlinx90; 10.05.2012