2012-04-05 14 views
1

Ich bekomme diesen Fehler, wenn ich mein Formular absende und kann nicht herausfinden, warum das passiert. Ich glaube, die Taglib sollte damit umgehen. Ich habe versucht, den Wert zu ändern, der in meinem jsp an itemValue="id" übergeben wird, aber es hat keinen Einfluss.Nicht zu beheben: 'java.lang.String' zu erforderlichen Typ 'java.util.Collection'

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'content' on field 'stateCollection': rejected value [com.myapp.cmt.model.State[ id=3 ]]; codes [typeMismatch.content.stateCollection,typeMismatch.stateCollection,typeMismatch.java.util.Collection,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [content.stateCollection,stateCollection]; arguments []; default message [stateCollection]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Collection' for property 'stateCollection'; nested exception is java.lang.IllegalStateException: 
Cannot convert value of type [java.lang.String] to required type [com.myapp.cmt.model.State] for property 'stateCollection[0]': no matching editors or conversion strategy found] 

Mein jsp

<strong>State</strong><br/> 
<form:checkboxes path="stateCollection" items="${states}" itemLabel="name"/> 

Mein Inhalt

public class Content implements Serializable { 
....... 

    @JoinTable(name = "content_to_state", joinColumns = { 
     @JoinColumn(name = "content_id", referencedColumnName = "id")}, inverseJoinColumns = { 
     @JoinColumn(name = "state_id", referencedColumnName = "id")}) 
    @ManyToMany 
    private Collection<State> stateCollection; 

..... 

    @XmlTransient 
    public Collection<State> getStateCollection() { 
     return stateCollection; 
    } 

    public void setStateCollection(Collection<State> stateCollection) { 
     this.stateCollection = stateCollection; 
    } 

..... 

mein Controller

... 
@RequestMapping(value = "/{guid}/save", method = RequestMethod.POST) 
public ModelAndView saveContent(@ModelAttribute("content") Content content, @PathVariable("guid") String guid) { 
    try { 
     // Save the modified object 
     contentService.save(content); 
    } catch (IllegalOrphanException ex) { 

... 

Mein Content-Service

... 
@Transactional 
public void save(Content content) throws IllegalOrphanException, NonexistentEntityException, RollbackFailureException, Exception { 
    try { 
     utx.begin(); 
     em.merge(content); 

     utx.commit(); 
    } catch (Exception ex) { 

    } finally { 
     if (em != null) { 
      em.close(); 
     } 
    } 
} 

... 

Antwort

0

Ich hatte das gleiche Problem. Ich benutze Spring, Hibernate. ich eine Klasse mit Composite Primärschlüssel und zwei Parameter Anfrage, mein Fehler passieren war:

@Entity 
@Table(name = "TAREAS") 
public class Tarea implements Serializable { 

    private static final long serialVersionUID = 1L; 
    protected TareaPK clave; 
    private String descripcion; 
    ..... 
} 

der Controller:

@RequestMapping(value = "/tareas", params = {"clave", "tipot"}, method = RequestMethod.GET) 
    public String formularioTareaEditar(
     @RequestParam(value = "clave") String clave, 
     @RequestParam(value = "tipot") String tipoTrabajo, 
     Model model) { 
    Tarea tarea = catalogoService.getTarea(tipoTrabajo, clave); 
    model.addAttribute(tarea); 
    return "tarea/editar"; 
    } 

    @RequestMapping(value = "/tareas", params = {"clave", "tipot"}, method = RequestMethod.POST) 
    public String tareaEditar(@Valid @ModelAttribute Tarea tarea, BindingResult result) { 
     if (result.hasErrors()) { 
     return "tarea/editar"; 
     } else { 
     catalogoService.edit(tarea); 
     return "redirect:/tareas"; 
     } 
    } 

Also ... wenn die Info wird in der Steuerung der Parameter clave wird als ob das Objekt TareaPK des Primärschlüssels betrachtet.

Ich ändere einfach den Namen des Parameters in meinem Controller.

@RequestMapping(value = "/tareas", params = {"txt_clave", "tipot"}, method = RequestMethod.GET) 
public String formularioTareaEditar(...){ 
... 
} 
Verwandte Themen