2017-11-06 4 views
2

カスタム注釈に基づいて、同じオブジェクトの複数のジャックソンデシリアライザを使用する予定です。 特定のフィールドのカスタムジャクソンシリアライザ

{"ssn":"123-45-6789", "name":"Bob Smith"} 

が、ログ記録の目的のために

(のための:私はこのオブジェクトがデフォルトの方法をシリアライズしたい「普通」の条件下で

public class UserInfo { 
    @Redacted  
    String ssn; 

    String name; 
} 

は、理想的には私のような、単一のPOJOを持っていると思います例)SSNを編集してログに保存されないようにしたい:

{"ssn":"xxx-xx-xxxx", "name":"Bob Smith"} 

私も見たことがある@JsonSerializeを使用してにし、思い付く:

public class UserInfo { 

    @JsonSerialize(using = RedactedSerializer.class, as=String.class) 
    String firstName; 
    String lastName; 

} 

これに伴う問題は、それは常に、このルールを使用することです。複数の@JsonSerializerを追加でき、指定されたものだけをランタイムコード内で使用できますか?

私は「ビュー」も見たことがありますが、理想的にはフィールドがリクエストに存在していることを少なくとも示したいと思います。

答えて

2

100%安全な方法は、異なる要求で異なるDTOを使用することです。好き

class Views { 
    public static class ShowSSN {} 
} 

private static class MyBean{ 
    @JsonSerialize(using = MyBeanSerializer.class) 
    @JsonView(Views.ShowSSN.class) 
    String ssn; 
    //getter setter constructor 
} 

private class MyBeanSerializer extends JsonSerializer<String> { 
    @Override 
    public void serialize(String value, JsonGenerator gen, 
          SerializerProvider serializers) throws IOException { 
     Class<?> jsonView = serializers.getActiveView(); 
     if (jsonView == Views.ShowSSN.class) 
      gen.writeString(value); // your custom serialization code here 
     else 
      gen.writeString("xxx-xx-xxxx"); 
    } 
} 

そして、それを使用します:あなたはそれを行うカント場合しかし、ええ、@JsonViewおよびカスタム・シリアライザ、のようなものを使用

また
public static void main(String[] args) throws JsonProcessingException { 
    ObjectMapper mapper = new ObjectMapper(); 
    MyBean bean = new MyBean("123-45-6789"); 

    System.out.println(mapper.writerWithView(Views.ShowSSN.class) 
          .writeValueAsString(bean)); 
    // results in {"ssn":"123-45-6789"} 

    System.out.println(mapper.writeValueAsString(bean)); 
    // results in {"ssn":"xxx-xx-xxxx"} 
} 

春に例えば、

を本当に使いやすいだろう
@Controller 
public class MyController { 
    @GetMapping("/withView")  // results in {"ssn":"123-45-6789"} 
    @JsonView(Views.ShowSSN.class) 
    public @ResponseBody MyBean withJsonView() { 
     return new MyBean("123-45-6789"); 
    } 

    @GetMapping("/withoutView") // results in {"ssn":"xxx-xx-xxxx"} 
    public @ResponseBody MyBean withoutJsonView() { 
     return new MyBean("123-45-6789"); 
    } 

} 
1

は私が

(コードは、あなたのジャクソンのバージョンによって異なります)、あなたが適切なシリアライザを設定し、それらを切り替えることができ、ない注釈、あなたのメソッドの内部 を符号化することにより、動的にそれを達成できると思い

ObjectMapper mapper = new ObjectMapper(); 
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null)); 
testModule.addSerializer(new RedactedSerializer()); // assuming serializer declares correct class to bind to 
mapper.registerModule(testModule); 

https://github.com/FasterXML/jackson-docs/wiki/JacksonHowToCustomSerializers

関連する問題