2017-06-07 8 views
0

Ich baue eine API und ich habe meine Ressourcenklasse gebaut, um JsonViews zu verwenden, um bestimmte Felder abhängig von der Anfrage zu filtern, die die API empfängt. Ich habe das funktioniert richtig, aber jetzt, ich versuche, einige Leistungsverbesserungen zu verfolgen, in denen bestimmte Felder auf der Ressource nicht einmal berechnet werden. Ich denke, wenn ich irgendwie einen bedingten Ausdruck machen kann, der auswertet, welche JsonView verwendet wird, könnte das ein Ausgangspunkt sein - ich bin mir jedoch nicht sicher über diesen Ansatz. Gibt es einen besseren Weg?Bedingte Ausdrücke abhängig von JsonView im Frühjahr

Was ich bisher habe:

Photo.java:

public class Photo { 
    @JsonView(Views.Public.class) 
    private Long id; 
    ... 
    JsonView(Views.PublicExtended.class) 
    private Double numLikes; 
    ... 

    Photo(PhotoEntity entity){ 
     this.id = entity.getId(); 
     ... 
    } 

    Photo(PhotoEntity entity, OtherObject oo){ 
     this.id = entity.getId(); 
     this.numLikes = oo.getNumLikes(); 
    } 

PhotoController.java

@JsonView(Views.Public.class) 
@RequestMapping(value = "/user/{user_id}", method = RequestMethod.GET) 
public ResponseEntity<List<Photo>> getAllForUser(@PathVariable("user_id") Long userId) throws NotFoundException { 
     return super.ok(svc.getAllForUser(userId)); 
    } 

@JsonView(Views.PublicExtended.class) 
    @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
    public ResponseEntity<PhotoResource> getOne(@PathVariable("id") Long id) throws NotFoundException { 
     return super.ok(svc.getOne(id)); 
    } 

PhotoService.java

public Photo entityToResource(PhotoEntity entity) { 
     // TODO : [Performance] Depending on the view that the controller received, construct the resource with/without OtherObject 
     String view = "View.PublicExtended.class"; 
     Photo resource; 
     if(view.equals("View.Public.class")){ 
      resource = new Photo(entity); 
     } 
     else{ 
      resource = new Photo(entity, this.getOtherObject(entity)); 
     } 
     return resource; 
    } 

Antwort

0

Ich habe etwas Ähnliches in meinem Code getan, indem ich einfach Getter benutze, anstatt Eigenschaften direkt zu kommentieren. Auf diese Weise ruft der Serialiser den Getter nur für Felder auf, die mit Anmerkungen versehen sind.