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;
    }

}

0 ответов

Другие вопросы по тегам