Search code examples
jsonspring-bootinheritancejackson-databind

Inheritance in Json Response Spring boot


I have two classes, A and B:

class A{
    private int numberOne;
    private int numberTwo;
    public int getNumberOne() {
        return numberOne;
    }
    public void setNumberOne(int numberOne) {
        this.numberOne = numberOne;
    }
    public int getNumberTwo() {
        return numberTwo;
    }
    public void setNumberTwo(int numberTwo) {
        this.numberTwo = numberTwo;
    }
    }

    class B extends A {

    private int numberThree;
    public int getNumberThree() {
        return numberThree;
    }
    public void setNumberThree(int numberThree) {
        this.numberThree = numberThree;
    }
}

How do I can like this:

    ResponseEntity<A> someMethod(){
        return new B(1,2,3);
    }
json 
    {
     "numberOne":"1",
     "numberTwo":"2"
    }

    ResponseEntity<B> someMethod(){
        return new B(1,2,3);
    }
json 
    {
     "numberOne":"1",
     "numberTwo":"2",
     "numberThree":"3"
    } 

How can I use JSON ignoring in Spring Boot which I want?


Solution

  • You create new class

    public class Views {
    public static class Public {
    }
    
    public static class Internal extends Public {
     }
    }
    

    A.class

    public class A {
    
    public A(int numberOne, int numberTwo) {
        this.numberOne = numberOne;
        this.numberTwo = numberTwo;
    }
    
    @JsonView(Views.Public.class)
    private int numberOne;
    @JsonView(Views.Public.class)
    private int numberTwo;
    
    public int getNumberOne() {
        return numberOne;
    }
    
    public void setNumberOne(int numberOne) {
        this.numberOne = numberOne;
    }
    
    public int getNumberTwo() {
        return numberTwo;
    }
    
    public void setNumberTwo(int numberTwo) {
        this.numberTwo = numberTwo;
    }
    

    }

    B.class

    public class B extends A{
    
    @JsonView(Views.Internal.class)
    private int numberThree;
    
    public B(int numberOne, int numberTwo) {
        super(numberOne, numberTwo);
    }
    
    public B(int numberOne, int numberTwo, int numberThree) {
        super(numberOne, numberTwo);
        this.numberThree = numberThree;
    }
    
    public int getNumberThree() {
        return numberThree;
    }
    
    public void setNumberThree(int numberThree) {
        this.numberThree = numberThree;
    }
    

    }

    Controller

     @GetMapping("/a-method")
    @JsonView(Views.Public.class)
    public ResponseEntity<A> getA(){
        return ResponseEntity.ok(new B(1,2,3));
    }
    
    @GetMapping("/b-method")
    @JsonView(Views.Internal.class)
    public ResponseEntity<B> getB(){
        return ResponseEntity.ok(new B(1,2,3));
    }