Spring 3.0 exception de la conversion de Chaîne de caractères en java.util.Date sur le POST

J'espère que quelqu'un pourra m'aider car j'ai été frapper ma tête contre un mur pour un couple de jours sur une question qui paraît simple et ce qui a été documenté dans d'autres fils de discussion sur le web.

Je suis à l'aide de Smart GWT client (3.0) en collaboration avec le Printemps 3.1 serveur et l'utilisation de JSON pour communiquer (avec Jackson API 1.9).

Le problème est que lorsque je tente d'enregistrer une date à partir de mon SmartGWT client et il est envoyé vers le serveur j'obtiens l'exception suivante:


org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'comment' on field 'dateAdded': rejected value [2012-06-27T10:57:47+0100]; codes [typeMismatch.comment.dateAdded,typeMismatch.dateAdded,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [comment.dateAdded,dateAdded]; arguments []; default message [dateAdded]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'dateAdded'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value '2012-06-27T10:57:47+0100'; nested exception is java.lang.IllegalArgumentException]
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:110)

J'ai vu ce problème dans quelques posts, mais la plupart se rapportent à ne pas avoir formaté la Date dans le format correct, mais j'ai essayé différents formats:
- aaaa-MM-jj
- aaaa-MM-jj PAS'HH:mm:ssZ
- yyyyMMddHHmmssZ (comme par suggestion ici: http://code.google.com/p/usersapi/issues/detail?id=8)

Donc, dans mon code j'ai effectué les opérations suivantes:

  1. Configuré un CustomObjectMapper:

`
public class CustomObjectMapper s'étend ObjectMapper {

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

public CustomObjectMapper() {
    super();
    configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
    setDateFormat(formatter);
    getDeserializationConfig().setDateFormat(formatter);
}

}
`

  1. Printemps app contexte ainsi:

`

<mvc:annotation-driven>
    <mvc:message-converters>            
        <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
            <constructor-arg ref="jaxbMarshaller" />
            <property name="supportedMediaTypes" value="application/xml"/>
        </bean>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="objectMapper" ref="jacksonObjectMapper" />
            <property name="supportedMediaTypes" value="application/json" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<context:component-scan base-package="com.jpmorgan.creditriskreporting.server" />

<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <constructor-arg ref="jaxbMarshaller" />
    <property name="supportedMediaTypes" value="application/xml"/>
</bean>


<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json" />
    <property name="objectMapper" ref="jacksonObjectMapper" />
</bean>


<bean id="jacksonObjectMapper" class="com.jpmorgan.creditriskreporting.server.util.CustomObjectMapper" />


<!-- Client -->
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <list>
            <ref bean="marshallingConverter" />
            <ref bean="jsonConverter" />
        </list>
    </property>
</bean>

`

  1. Bean objet:

`
importer java.util.Date;

@JsonAutoDetect
public class Commentaire {

private int id;
private String comment;
private Date dateAdded;

public Comment() {}

public Comment(int id) {
    this.id = id;
}

...

//@JsonSerialize(using=JsonDateSerializer.class) -- I had previously tried to use these custom Date serializer class
public Date getDateAdded() {
    return dateAdded;
}
//@JsonDeserialize(using=JsonDateDeserializer.class)
public void setDateAdded(Date dateAdded) {
    this.dateAdded = dateAdded;
}

`

EDIT:

  1. Contrôleur De Classe

Ce peut-être là où réside le problème, car lorsque j'utilise @RequestBody il travaille à partir de mes tests d'Intégration, cependant, mon Résumé RestDataSource dans SmartGWT fonctionne uniquement avec @ModelAttribute, donc je ne suis pas sûr de savoir comment procéder.


@RequestMapping(value="/", method=RequestMethod.POST)
public @ResponseBody Comment createNewComment2(@ModelAttribute Comment comment) {
log.info("calling createComment with comment: {}", comment);
comment.setDateAdded(new Date());
Comment added = commentDao.create(comment);
log.info("created comment: {}", added);
return commentDao.get(comment);
}

Afin que je puisse récupérer les données à partir du serveur et la date est affichée dans SmartGWT amende. C'est seulement lorsque je ne l'ajout de données que je reçois sur la question. À partir de Smart GWT Developer Console:


{
"dataSource":"CommentDS",
"operationType":"add",
"componentId":"isc_DynamicForm_1",
"data":{
"userAdded":"sharper",
"dateAdded":"2012-06-27T10:57:47+0100",
"comment":"sample"
},
"callback":{
"target":[DynamicForm ID:isc_DynamicForm_1],
"methodName":"saveEditorReply"
},
"showPrompt":true,
"prompt":"Saving form...",
"oldValues":{
},
"clientContext":{
},
"requestId":"CommentDS$6272"
}

Tout, est très apprécié.

Cheers,
Steve

OriginalL'auteur Stephen Harper | 2012-06-27