Spring HATEOAS с вложенными ресурсами и фильтрацией JsonView
Я пытаюсь добавить ссылки HATEOAS с Resource<>
, а также фильтрация с @JsonView
, Однако я не знаю, как добавить ссылки на вложенные объекты.
В проекте, посвященном Github, я расширил этот проект (добавив запрос open pull, чтобы он работал без вложенных ресурсов), добавив сущность "Character", которая имеет вложенный User
,
При доступе к ~/characters/resource-filtered
маршрут, ожидается, что вложенный User
"игрок" появляется с firstNm
а также bioDetails
с помощью Spring и сгенерированных ссылок на себя, но без userId
а также lastNm
поля.
У меня фильтрация работает правильно, но я не могу найти пример вложенных ресурсов, который соответствует ResourceAssembler
парадигма. По-видимому, необходимо использовать ResourceAssembler
делать @JsonView
Работа.
Любая помощь в согласовании этих двух понятий будет принята с благодарностью. Если вы можете взломать его целиком, рассмотрите возможность отправки мне запроса.
User.java
//package and imports
...
public class User implements Serializable {
@JsonView(UserView.Detail.class)
private Long userId;
@JsonView({ UserView.Summary.class, CharacterView.Summary.class })
private String bioDetails;
@JsonView({ UserView.Summary.class, CharacterView.Summary.class })
private String firstNm;
@JsonView({ UserView.Detail.class, CharacterView.Detail.class })
private String lastNm;
public User(Long userId, String firstNm, String lastNm) {
this.userId = userId;
this.firstNm = firstNm;
this.lastNm = lastNm;
}
public User(Long userId) {
this.userId = userId;
}
...
// getters and setters
...
}
CharacterModel.java
//package and imports
...
@Entity
public class CharacterModel implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonView(CharacterView.Summary.class)
private Long characterId;
@JsonView(CharacterView.Detail.class)
private String biography;
@JsonView(CharacterView.Summary.class)
private String name;
@JsonView(CharacterView.Summary.class)
private User player;
public CharacterModel(Long characterId, String name, String biography, User player) {
this.characterId = characterId;
this.name = name;
this.biography = biography;
this.player = player;
}
public CharacterModel(Long characterId) {
this.characterId = characterId;
}
...
// getters and setters
...
}
CharacterController.java
//package and imports
...
@RestController
@RequestMapping("/characters")
public class CharacterController {
@Autowired
private CharacterResourceAssembler characterResourceAssembler;
...
@JsonView(CharacterView.Summary.class)
@RequestMapping(value = "/resource-filtered", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public Resource<CharacterModel> getFilteredCharacterWithResource() {
CharacterModel model = new CharacterModel(1L, "TEST NAME", "TEST BIOGRAPHY", new User(1L, "Fred", "Flintstone"));
return characterResourceAssembler.toResource(model);
}
...
}
CharacterResourceAssembler.java
//package and imports
...
@Component
public class CharacterResourceAssembler implements ResourceAssembler<CharacterModel, Resource<CharacterModel>>{
@Override
public Resource<CharacterModel> toResource(CharacterModel user) {
Resource<CharacterModel> resource = new Resource<CharacterModel>(user);
resource.add(linkTo(CharacterController.class).withSelfRel());
return resource;
}
}