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.
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
İ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
[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