2015-07-03 9 views
0

Я использую Spring boot v1.2.3 с помощью quickxml jackson annotations, и я пытаюсь разоблачить всю коллекцию сестер в один ответ JSON, но может Кажется, что вы получаете добавленную коллекцию в ответ, используя правильные аннотации и секретный код.Добавление коллекции в ответ JSON с использованием Spring Boot и quickxml jackson и @OneToMany аннотации

Может ли кто-нибудь помочь мне устранить проблему?

Я не уверен, что это что-то в весеннем ботинке - причина или просто взаимопонимание между аннотациями. Я хотел бы, чтобы коллекция была добавлена ​​в json из дочерней базы данных.

@Entity 
@Table(name = "station") 
public class Station implements Serializable { 



    @OneToMany(mappedBy = "station", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    private Set<StationTank> stationTanks; 

    @JsonManagedReference("station-tank") 
    public Set<StationTank> getStationTanks() { 

     System.out.println("get tank count: " + stationTanks.size()); 
     return stationTanks; 
    } 

    public void setStationTanks(Set<StationTank> stationTanks) { 

     System.out.println("set tank count: " + stationTanks.size()); 

     this.stationTanks = stationTanks; 
    } 


} 



@Entity 
@Table(name = "station_tank") 
public class StationTank implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "station_tank_id") 
    private long stationTankId; 


    @Column(name = "active",nullable=true, columnDefinition="Boolean default false") 
    private Boolean active; 


    @ManyToOne(cascade = CascadeType.ALL, optional = false) // as defined in schema 
    @JoinColumn(name = "station_id") 
    private Station station; 


    @JsonBackReference("station-tank") 
    public Station getStation() { 
     return station; 
    } 

    public void setStation(Station station) { 
     this.station = station; 
    } 

} 

Вызов этого URL у меня нет коллекции родственной добавил к ответу, и я хочу коллекцию родственной в ответ. http://localhost:8080/stations/1

{ 
    "stationId": 1, 
    "stationName": "station name 1", 
    "active": true, 
    "_links": 
    { 
     "self": 
     { 
      "href": "http://localhost:8080/stations/1" 
     }, 
     "stationTanks": 
     { 
      "href": "http://localhost:8080/stations/1/stationTanks" 
     } 
    } 
} 

Но когда я называю URL для сбора родственного я получаю сбор родственного штраф, просто я хочу коллекцию родственной в вышеуказанном ответ.

{ 
    "_embedded": 
    { 
     "station_tanks": 
     [ 
      { 
       "stationTankId": 1, 
       "active": true, 
       "_links": 
       { 
        "self": 
        { 
         "href": "http://localhost:8080/station_tanks/1" 
        }, 
        "station": 
        { 
         "href": "http://localhost:8080/station_tanks/1/station" 
        } 
       } 
      }, 
      { 
       "stationTankId": 2, 
       "active": true, 
       "_links": 
       { 
        "self": 
        { 
         "href": "http://localhost:8080/station_tanks/2" 
        }, 
        "station": 
        { 
         "href": "http://localhost:8080/station_tanks/2/station" 
        } 
       } 
      } 
     ] 
    } 
} 
+0

Кто-нибудь знает, что генерирует «_links»: раздел? Мне интересно, генерируется ли это из весенней загрузки или библиотеки quickxml jackson. –

ответ

1

Вы можете аннотировать поля или добытчик с @JsonView(class) и после использования одной аннотации с тем же классом на вашем методе контроллера - это лучшее решение, или просто аннотировать не ожидаемые поля с @JsonIgnore

Here больше информации о конфигурации джексона

+0

Спасибо за ответ. Я заметил эту реализацию, но не был уверен в этом. Попробую. Еще раз спасибо. –

1

Ответ от kxyz дал мне решение, я хотел бы дать более ясные подробности окончательному решению для других.

Я не использовал аннотации @JsonManagedReference и @JsonBackReference.

мне пришлось создать следующий вид:

public class StationView { 

    public interface Summary{} 
    public interface SummaryWithSiblings extends Summary{} 

} 

и контроллер (вместо использования контроллера тайны пружины загрузки, который должен быть создан на старте), так что это может быть аннотированный с этим новым StationView

@RestController 
public class StationController { 

    @Autowired 
    private StationService stationService; 

    @JsonView(StationView.SummaryWithSiblings.class) 
    @RequestMapping("/stations") 
    public List<Station> getStations() { 
     Integer clientId = 1234; 
     return stationService.findByClientId(clientId); 
    } 

} 

Я аннулировал каждую переменную класса, которую должен показать JSON как для родительского класса, так и для класса sibling.

@JsonView(StationView.Summary.class) 
@Column(name = "station_name") 
private String stationName;) 

и коллекция братьев одинаково.

@JsonView(StationView.SummaryWithSiblings.class) 
@OneToMany(mappedBy = "station", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
private Set<StationTank> stationTanks; 

И я получаю что-то подобное от ответа JSON.

[ 
    { 
     "stationId": 1, 
     "stationName": "station name 1", 
     "active": true, 
     "stationTanks": 
     [ 
      { 
       "stationTankId": 1, 
       "active": true 
      }, 
      { 
       "stationTankId": 2, 
       "active": true 
      } 
     ] 
    } 
]