2017-03-24 11 views
4

登録終了点を持つRESTful Spring Boot APIがあります。Spring起動前処理Raw JSONデータ

私はの値を持つ空白のみの文字列をトリムして置き換えるために、私の単純な文字列値プリプロセッサを書きました。

@InitBinder 
    public void blankStringBinder(WebDataBinder dataBinder) { 
    dataBinder.setDisallowedFields("password", "confirmPassword"); 
    StringTrimmerEditor stringTrimmerEditor = new StringTrimmerEditor(true); 
    dataBinder.registerCustomEditor(String.class, stringTrimmerEditor); 
    } 

しかし、私は生のJSONとしてポストマンからのデータを提出する場合、トリミング編集が行われていません。私はblankStringBinderメソッドの中にブレークポイントを入れて、それが着信要求ごとに呼び出されるのを見る。

WebDataBinderform-dataのために働くようです。生のJSONデータでも動作させる方法はありますか?

答えて

3

カスタムJsonDeserializer作成:

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.DeserializationContext; 
import com.fasterxml.jackson.databind.JsonDeserializer; 
import com.fasterxml.jackson.databind.JsonNode; 

public class EmptyToNullCustomDeserializer extends JsonDeserializer<String> { 
    @Override 
    public String deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException { 
     JsonNode node = jp.readValueAsTree(); 
     if (node.asText().isEmpty()) { 
      return null; 
     } 
     return node.toString(); 
    } 
} 

そして、POJOの各文字列に、この注釈の追加:@JsonDeserialize(using = EmptyToNullCustomDeserializer.class)を。たとえば :

@JsonDeserialize(using = EmptyToNullCustomDeserializer.class) 
private String content; 


編集:

あなたは文字列の多くを持っている場合、それは面倒なことができます。

すべての文字列に一般化するためには、あなたがEmptyToNullCustomDeserializerを変更する必要があります。

@Component 
public class EmptyToNullCustomDeserializer extends StdDeserializer<String> { 
    protected EmptyToNullCustomDeserializer() { 
     super(String.class); 
    } 

    @Override 
    public String deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException { 
     JsonNode node = jp.readValueAsTree(); 
     if (node.asText().isEmpty()) { 
      return null; 
     } 
     return node.toString(); 
    } 
} 

そして、このコンポーネントを作成します。

@Component 
public class JacksonConfiguration { 

    @Autowired 
    private EmptyToNullCustomDeserializer emptyToNullCustomDeserializer; 

    @Primary 
    @Bean 
    public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(List<Jackson2ObjectMapperBuilderCustomizer> customizers) { 
     Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
     for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) { 
      customizer.customize(builder); 
     } 
     return builder; 
    } 

    @Bean 
    public Jackson2ObjectMapperBuilderCustomizer addEmptyToNullStringDeserialization() { 
     return new Jackson2ObjectMapperBuilderCustomizer() { 
      @Override 
      public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) { 
       jacksonObjectMapperBuilder.deserializerByType(String.class, emptyToNullCustomDeserializer); 
      } 

     }; 
    } 
} 
関連する問題