2016-05-25 10 views
0

Ich versuche, in der es von meinem Controller im Frühjahr ein Objekt mit einem anderen Objekt zu erhalten, aber ich habe diesen Fehler :Fehler beim Eigenschaftswert vom Typ ‚java.lang.String‘ konvertieren - Objekt Empfängt mit einem anderen Objekt im Frühling

ich den Anruf mit so mache:

$("#form").ajaxForm({ 
type: "POST", 
headers: { 
    Authorization: $cookieStore.get("userPassword"), 
    FeatureName: name, 
}, 
success: function (data) { 
    console.log("reload page"); 


}, 
dataType: "text" 
}).submit(); 

bekomme ich den Fehler:

Failed to convert property value of type 'java.lang.String' to required type 'com.Option' for property 'option' 

ist dies die gesamte Ausgangsleitung:

org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'modelDTO' on field 'option': rejected value [{"id":3,"optionName":"Other"}]; codes [typeMismatch.modelDTO.option,typeMismatch.option,typeMismatch.com.Option,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [modelDTO.option,option]; arguments []; default message [option]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.Option' for property 'option'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.Option] for property 'option': no matching editors or conversion strategy found] 

das ist mein Controller und der DTO

@RequestMapping(value = "/save", method = RequestMethod.POST) 
@Transactional 
public @ResponseBody void save(@ModelAttribute("form") ModelDTO model) 
... 

public class ModelDTO implements Serializable 
{ 

    private static final long serialVersionUID = 3276874897891652914L; 
    private Long userId; 
    private Option option; 

    public Long getUserId() 
    { 
     return userId; 
    } 

    public void setUserId(Long userId) 
    { 
     this.userId = userId; 
    } 

    public Option getOption() 
    { 
     return option; 
    } 

    public void setOption(Option option) 
    { 
     this.option = option; 
    } 

} 

Feder erlaubt es, diese Arbeit zu tun?

+0

Ja, es funktioniert ... Und das Problem ist der Controller ... Sie senden JSON aber erwarten Basismodell Attributbindung. Beschriften Sie das Methodenargument mit '@ RequestBody'. Es sei denn, Sie sind wirklich seltsame Dinge tun ... –

+0

Ich fügte hinzu, die '@ RequestBody' und ich bin immer' POST https: // localhost: 8443/app/save 415 (Unsupported Media Type) ' – gogoru

+0

Entfernen' dataType'. –

Antwort

0

habe ich die Lösung, ich brauche nichts von meinem Code ändern, wo ich die Bindung mache. Mit dieser Lösung können wir die Daten verarbeiten, die nicht automatisch konvertiert werden.

wie:

@InitBinder 
    public void initBinderAll(WebDataBinder binder) 
    { 
     binder.registerCustomEditor(Option.class, new OptionPropertyEditor()); 
    } 

und die benutzerdefinierte PropertyEditorSupport wie:

public class OptionPropertyEditor extends PropertyEditorSupport 
0

Da Sie Daten auf dem Controller durch die Anforderungsmethode POST senden, müssen Sie Ihre ModelDTO model mit @RequestBody zu annotieren und entfernen @ResponseBody es sei denn, Ihre Methode tatsächlich etwas zurückgeben soll. Stellen Sie außerdem sicher, dass die Daten, die Sie über Ihr Formular senden, tatsächlich mit Ihrer ModelDTO übereinstimmen. nur hinzufügen initBinderAll im Controller

Verwandte Themen