@DateTimeFormat は @JsonFormat では完全には解析されません

序文

  • いつも曖昧で忘れがちなので@DateTimeFormat今日@JsonFormatはメモしておきます 原理が絡んでいないのでソースコードが解析しきれていないので時間がある時にソースコードを見てみます
  • お急ぎの場合は、認証プロセスをスキップして直接視聴することもできます结论

テストコード

  • 基本的なコードは次のとおりです。
  • エンティティクラス
public class User {
    
    

    public final static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    private String name;

    private Date birthday;

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public Date getBirthday() {
    
    
        return birthday;
    }

    public void setBirthday(Date birthday) {
    
    
        this.birthday = birthday;
    }
}

  • コントローラ
@RestController
public class TestController {
    
    

    @RequestMapping("/test")
    public User test(User user){
    
    
        return user;
    }
}

@DateTimeFormat

注釈なしで

  • postman を使用してパラメータを渡すことができませんbirthday

ここに画像の説明を挿入
ここに画像の説明を挿入

  • 通常をキャンセルしますbirthday
    ここに画像の説明を挿入

通常のリクエスト

  • それでは追加しましょう@DateTimeFormat
   @DateTimeFormat(pattern = YYYY_MM_DD_HH_MM_SS)
    private Date birthday;
  • 入社後GET/POST都成功
    ここに画像の説明を挿入

ここに画像の説明を挿入

JSONリクエスト

  • リクエストパラメータがjsonの場合をテストしてみましょう。
   @RequestMapping("/test")
    public User test(@RequestBody User user){
    
    
        return user;
    }
  • 干渉しないように、最初は name パラメータだけを試してください。

ここに画像の説明を挿入

  • name パラメーターは成功し、birthday パラメーターが追加されますが、例外が発生し、JSON を渡すことができません。

ここに画像の説明を挿入

@JsonFormat

通常のリクエスト

  • コード
 @JsonFormat(pattern = YYYY_MM_DD_HH_MM_SS)
    private Date birthday;
  • 通常のリクエストエラー

ここに画像の説明を挿入
ここに画像の説明を挿入

JSONリクエスト

  • コントローラーを変更する
   @RequestMapping("/test")
    public User test(@RequestBody User user){
    
    
        return user;
    }
  • 検査結果は正常です
    ここに画像の説明を挿入
  • 注: Spring框架默认序列化框架用Jackson,所以你没改序列化框架的话,加了@JsonFormat还具备格式化返回值的能力

その他の方法 (@InitBinder)

  • 新しいものを追加BaseController、TestController 継承BaseController
public class BaseController {
    
    

    /**
     * 将前台传递过来的日期格式的字符串,自动转化为Date类型
     */
    @InitBinder
    public void initBinder(WebDataBinder binder)
    {
    
    
        // Date 类型转换
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
        {
    
    
            @Override
            public void setAsText(String text)
            {
    
    
                setValue(DateUtils.parseDate(text));
            }
        });


    }

}



@RestController
public class TestController extends BaseController {
    
    

    @RequestMapping("/test")
    public User test(User user){
    
    
        return user;
    }
}

  • このようにして、通常のリクエストの時間を受け取る機能も取得します。
    ここに画像の説明を挿入
  • ただし、JSON リクエストはエラーを報告します。
  • ここに画像の説明を挿入

ここに画像の説明を挿入

結論は

  • @DateTimeFormat通常のリクエスト メソッドに適用され、JSON リクエスト メソッドはエラーを報告します。
  • @JsonFormat JSONリクエストメソッドに適用され、通常のリクエストではエラーが報告されます。
  • 注: Spring框架默认序列化框架用Jackson,所以你没改序列化框架的话,加了@JsonFormat还具备格式化返回值的能力
  • @InitBinderこのメソッドではコードを自分で記述する必要があり、その効果は@DateTimeFormat通常のリクエスト メソッドと同様で、JSON リクエスト メソッドはエラーを報告します。

送信元アドレス

おすすめ

転載: blog.csdn.net/baidu_19473529/article/details/131330216