Возвращение разных списков типов ресурсов из одного метода - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть этот метод для запроса GET со встроенным параметром.Основная идея заключается в том, что если ссылка содержит? Внедренный = true, она возвращает сущность, а если она не соответствует истине, то возвращает объект DTO:

@GetMapping("/todos") 
    public List<Resource<?>> getAllToDoNote(@RequestParam(value = "embedded",required =false)String embedded){
        List<Resource<ToDoNote>> noteResources = new ArrayList<Resource<ToDoNote>>();
        List<ToDoNote> allNotes = toDoNoteService.getAllToDoNote();

        if(embedded!=null && embedded.equals("true")) {
            for(int i=0; i< allNotes.size();i++) {
            Resource<ToDoNote> noteResource = new Resource<>(allNotes.get(i));
            //Link linkTo = linkTo(methodOn(this.getClass()).getNotesUsers(allNotes.get(i).getId())).withRel("users");

            //noteResource.add(linkTo);
            noteResources.add(noteResource);
            }

            //return toDoNoteService.getAllToDoNote();
            return noteResources;
        }

        else {
            //System.out.println("embedded " +embedded);
            List<Resource<ToDoNoteDTO>> dtoResources = new ArrayList<Resource<ToDoNoteDTO>>();
            notes = toDoNoteService.getAllToDoNote();
            List<ToDoNoteDTO> noteDtos = new ArrayList<ToDoNoteDTO>();
            for(int i=0; i<notes.size(); i++) {
                //System.out.println("size" +notes.get(i).getName());
                noteDtos.add(convertToDto(notes.get(i)));
            }

            for(int i=0; i< noteDtos.size();i++) {
                Resource<ToDoNoteDTO> dtoResource = new Resource<>(noteDtos.get(i));
                Link linkTo = linkTo(methodOn(this.getClass()).getNotesUsers(allNotes.get(i).getId())).withRel("users");

                dtoResource.add(linkTo);
                dtoResources.add(dtoResource);
                }

            return dtoResources;
            //return null;
        }

    }


@Validated

public class ToDoNote {
    private Integer id;
    @NotNull(message = "Name may not be null")
    private String name;
    @JsonFormat(pattern="yyyy-MM-dd")
    private Date dateToComplete;
    private String description;
    private Integer priority;
    private Boolean completed;
    private ArrayList<User> users; 
....

}

public class ToDoNoteDTO {
    private Integer id;
    @NotNull(message = "Name may not be null")
    private String name;
    @JsonFormat(pattern="yyyy-MM-dd")
    private Date dateToComplete;
    private String description;
    private Integer priority;
    private Boolean completed;
....
}

Однако я получаю ошибки в возвращаемых строках: Типошибка: невозможно преобразовать из списка > в список >.Если я ставлю вопросительные знаки везде, это позволяет мне запустить программу, однако тогда она возвращает ссылки с другими полями, которые являются нулевыми.Есть ли какие-либо другие методы о том, как вернуть два разных типа?Поскольку мне нужно либо вернуть полную сущность, либо DTO, который не содержит все поля.

РЕДАКТИРОВАТЬ

Я смог заставить его работать, используя Ресурсы>однако вместо List теперь есть свойство _embedded, и после небольшого поиска, кажется, нет способа его удалить.Так что я просто хотел бы получить некоторые идеи о том, как обрабатывать этот случай, когда отвечать различными сущностями на основе данного встроенного параметра.Спасибо.

EDIT2 Добавлены сущность и класс DTO.

1 Ответ

0 голосов
/ 22 апреля 2019

Если вы хотите вернуть разные поля в зависимости от потребностей пользователя, я бы посоветовал использовать проекции остатков данных пружины: см. https://docs.spring.io/spring-data/rest/docs/current/reference/html/#projections-excerpts

...