3

フォーム送信時の Ajax リクエストに問題があります。フォームには、次の stringify JSON データが含まれています。

{"articleContent":"<p>aaa</p>","title":"Po vyplnění titulku aktuality budete","header":"aa","enabled":false,"timestamp":"1358610697521","publishedSince":"03.01.2013 00:00","publishedUntil":"","id":"10"}

json に"03.01.2013 00:00"の値が含まれている場合、サーバーの応答は400 Bad Requestです

問題は、カスタム DateTimePropertyEditor (@InitBinder で登録) が呼び出されず、文字列形式の DateTime が変換されないことです。この問題を解決する方法はありますか?

リクエストを処理しているコントローラーのマップされたメソッド

@RequestMapping( value = "/admin/article/edit/{articleId}", method = RequestMethod.POST, headers = {"content-type=application/json"})
public @ResponseBody JsonResponse  processAjaxUpdate(@RequestBody Article article, @PathVariable Long articleId){
    JsonResponse response = new JsonResponse();
    Article persistedArticle = articleService.getArticleById(articleId);
    if(persistedArticle == null){
        return response;
    }
    List<String> errors = articleValidator.validate(article, persistedArticle);

    if(errors.size() == 0){
        updateArticle(article, persistedArticle);
        response.setStatus(JsonStatus.SUCCESS);
        response.setResult(persistedArticle.getChanged().getMillis());
    }else{
        response.setResult(errors);
    }

    return response;
}

InitBinder

 @InitBinder
        public void initBinder(WebDataBinder binder) {
            binder.registerCustomEditor(DateTime.class, this.dateTimeEditor);
        }
4

3 に答える 3

5

@JsonDeserializeを使用してこの問題を解決しました

@JsonDeserialize(using=DateTimeDeserializer.class)
public DateTime getPublishedUntil() {
    return publishedUntil;
}

カスタムデシリアライザーを実装する必要があります。

    public class DateTimeDeserializer extends StdDeserializer<DateTime> {

    private DateTimeFormatter formatter = DateTimeFormat.forPattern(Constants.DATE_TIME_FORMAT);

    public DateTimeDeserializer(){
        super(DateTime.class);
    }

    @Override
    public DateTime deserialize(JsonParser json, DeserializationContext context) throws IOException, JsonProcessingException {
            try {
                if(StringUtils.isBlank(json.getText())){
                    return null;
                }
                return formatter.parseDateTime(json.getText());
            } catch (ParseException e) {
                return null;
            }
    }
}
于 2013-01-20T15:10:54.783 に答える
2

これは、JSON ボディではなくフォーム フィールドに作用するプロパティ エディタでは処理されません。json で非標準の日付形式を処理するには、基になるObjectMapperをカスタマイズする必要があります。jackson 2.0+ を使用していると仮定すると、次のことができます。

a. ここの指示に基づいて、オブジェクトマッパーに日付の形式を伝える注釈で publishedSince フィールドにタグを付けます。

public class Article{
    ...
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="MM.dd.yyyy HH:mm")
    private Date publishedSince;
}

b. または 2 番目のオプションは、ObjectMapper 自体を変更することですが、これはグローバルである可能性があるため、うまくいかない場合があります。

public class CustomObjectMapper extends ObjectMapper {
    public CustomObjectMapper(){
        super.setDateFormat(new SimpleDateFormat("MM.dd.yyyy hh:mm"));
    }   
}

これを Spring MVC で構成します。

<mvc:annotation-driven> 
   <mvc:message-converters register-defaults="true">
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <bean class="..CustomObjectMapper"/>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>
于 2013-01-19T16:54:02.257 に答える