2015-04-24 23 views
5

Huzurlu bir api oluşturmak için ilkbaharı kullanıyorum, o kadar iyiyim ki, sorum benim cevaba dinamik olarak giden alanları nasıl modellemektir? deAlanları json yanıtından dinamik olarak nasıl kaldırabilirsiniz?

public class Album { 

private final String id; 
private final String title; 
private final Artist artist; 
private int stockLevel; 

public Album(final String id, final String title, final Artist artist, int stockLevel) { 
    this.id = id; 
    this.title = title; 
    this.artist = artist; 
    this.stockLevel = stockLevel; 
} 

public String getId() { 
    return id; 
} 

public String getTitle() { 
    return title; 
} 

public Artist getArtist() { 
    return artist; 
} 

public int getStockLevel() { 
    return stockLevel; 
} 

public void setStockLevel(int stockLevel) { 
    this.stockLevel = stockLevel; 
} 
} 
+0

Kullanım durumunuz, farklı yanıtlarda farklı özellik alt kümeleri olmasını istiyorsanız, jackson'da [JSON görüntülemeleri] (http://wiki.fasterxml.com/JacksonJsonViews) kullanabilirsiniz. – beerbajay

+0

İstediğim gibi görünüyor, ancak bu yöntemi kullanacak olursam, elleçlemeyi manuel olarak kontrol etmem gerekecek, dolayısıyla baharı atlayarak, bunun bir örneğini görüyor musunuz? – danillosl

+0

[bu blog yayını] başına (https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring), denetleyicilerinize @JsonView (MyView.class) ekleyerek not ekleyebilirsiniz.) 've bahar – beerbajay

cevap

3

bu şartı ile mücadele ediyorum:

@Controller 

public class AlbumController { 

@Autowired 
private MusicService musicService; 

@RequestMapping(value = "/albums", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public Collection<Resource<Album>> getAllAlbums() { 

    Collection<Album> albums = musicService.getAllAlbums(); 
    List<Resource<Album>> resources = new ArrayList<Resource<Album>>(); 
    for (Album album : albums) { 
     resources.add(this.getAlbumResource(album)); 
    } 
    return resources; 

} 

@RequestMapping(value = "/album/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public Resource<Album> getAlbum(@PathVariable(value = "id") String id) { 

    Album album = musicService.getAlbum(id); 
    return getAlbumResource(album); 

} 

private Resource<Album> getAlbumResource(Album album) { 

    Resource<Album> resource = new Resource<Album>(album); 


    // Link to Album 
    resource.add(linkTo(methodOn(AlbumController.class).getAlbum(album.getId())).withSelfRel()); 
    // Link to Artist 
    resource.add(linkTo(methodOn(ArtistController.class).getArtist(album.getArtist().getId())).withRel("artist")); 
    // Option to purchase Album 
    if (album.getStockLevel() > 0) { 
     resource.add(linkTo(methodOn(AlbumController.class).purchaseAlbum(album.getId())).withRel("album.purchase")); 
    } 

    return resource; 

} 

@RequestMapping(value = "/album/purchase/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public Resource<Album> purchaseAlbum(@PathVariable(value = "id") String id) { 

    Album a = musicService.getAlbum(id); 
    a.setStockLevel(a.getStockLevel() - 1); 
    Resource<Album> resource = new Resource<Album>(a); 
    resource.add(linkTo(methodOn(AlbumController.class).getAlbum(id)).withSelfRel()); 
    return resource; 

} 
} 

Ve modeli:

i kullanıyorum kontrolörü Thats.

http://wiki.fasterxml.com/JacksonJsonViews

Spring Boot 1.2.3 kullanıyorum:

Aşağıdaki kodu zaten sorunuzun açıklamada @beerbajay bahsettiği JsonViews kullanarak bir çözümdür.

Views.java

package demo; 

public class Views { 

    static interface Public {} 

    static interface Internal extends Public {} 
} 

Album.java

package demo; 

import com.fasterxml.jackson.annotation.JsonView; 

public class Album { 

    @JsonView(Views.Public.class) 
    private String id; 

    @JsonView(Views.Public.class) 
    private String title; 

    @JsonView(Views.Public.class) 
    private String artist; 

    @JsonView(Views.Internal.class) 
    private String secret; 

    public Album(String id, String title, String artist, String secret) { 
     this.id = id; 
     this.title = title; 
     this.artist = artist; 
     this.secret = secret; 
    } 

} 

AlbumController.java

package demo; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.http.MediaType; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.ObjectWriter; 

@RestController 
public class AlbumController { 

    @Autowired 
    ObjectMapper mapper; 

    @RequestMapping(value = "/album", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
    public String getAlbum() throws JsonProcessingException { 
     Album foo = new Album("1", "foo", "John Doe", "secretProperty"); 

     // replace the following value with runtime logic of your choice, 
     // e.g. role of a user 
     boolean forInternal = false; 

     ObjectWriter viewWriter; 
     if (forInternal) { 
      viewWriter = mapper.writerWithView(Views.Internal.class); 
     } else { 
      viewWriter = mapper.writerWithView(Views.Public.class); 
     } 

     return viewWriter.writeValueAsString(foo); 
    } 
} 

Yani anahtar jackson en ObjectMapper ve ObjectWriter bir dize oluşturmak için kullanmaktır json temsilcisi nesnenizin iyonu.

Benim için çirkin hissediyor ama işe yarıyor. Elbette, bu soru, birden fazla RequestMapping'u tanımlarken bu ölçeklerin nasıl kaldığıdır.

+0

Json şablonlarını seçmenin en iyi yolu görünüyor, cevabınız için teşekkürler, https://spring.io/blog/2014/12/02/latest-jackson -Entegrasyon-iyileştirmeler-içinde-yay. – danillosl

+0

Bunun çok eski bir cevap olduğunu biliyorum, ancak yanıt kütlesinden göz ardı etmek istediğiniz alanlarda @JsonIgnore kullanabilirsiniz. –

İlgili konular