2017-03-17 5 views
0

Webアプリケーションの作成および更新フォームには、サイズの検証があります。例えば:スプリングブートストリングすべてのフォームフィールドのデシリアライザ

@Size(min = 4, max = 20) 
private String mobile; 

このフィールドは必須ではありません。しかし、フロントエンドのユーザーはフィールドをクリアしたい。長さの制限のため、フォームの検証に失敗します。着信データは、nullではなく空の文字列です。最小の長さの検証によって入力が制限されます。

したがって、空の文字列をnull値に変換するソリューションを検索し始めます。私は@InitBinderStringTrimmerEditorソリューションを見つけましたが、私たちのシステムは@ResponseBodyアプローチを使用しています。だからそれは合わない。

注釈を追加するか、すべての文字列フィールドにカスタムセッターを書き込むことは、DRYソリューションではありません。

文字列フィールドには、幅広いカスタムデシリアライザを追加したいだけです。

答えて

1

@JsonDeserializeアノテーションを追加する代わりに、カスタムデシリアライザをModule(たとえば、SimpleModule)で登録するだけで、すべてのStringの値付きプロパティに適用されます。ような何か:

SimpleModule module = new SimpleModule(...); 
module.addDeserializer(String.class, new CustomTrimDeserializer()); 
mapper.registerModule(module); 
0

は、私は最終的にJsonComponentModuleクラスを調べて、気づいた春は、デシリアライザ登録JsonComponent注釈を探しています。

これは、ソリューション

@RestController 
@SpringBootApplication 
public class CheckNullApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(CheckNullApplication.class, args); 
    } 

    @PostMapping("/check-null") 
    public boolean checkNull(@RequestBody final HelloForm form) { 
     return form.getName() == null; 
    } 

    public static class HelloForm { 

     private String name; 

     public String getName() { return name; } 

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

    @JsonComponent 
    public static class StringTrimmerDeserializer extends JsonDeserializer<String> { 

     @Override 
     public String deserialize(final JsonParser p, final DeserializationContext ctxt) 
      throws IOException, JsonProcessingException { 

      String result = StringDeserializer.instance.deserialize(p, ctxt); 

      if (result != null) { 
       result = result.trim(); 

       if (StringUtils.isEmpty(result)) { 
        return null; 
       } 
      } 

      return result; 
     } 
    } 
} 
に1つのファイルのスプリングブートプロジェクトです
関連する問題