Не удалось написать JSON: (было java.lang.NullPointerException); Вложенным исключением является com.fasterxml.jackson.databind.JsonMappingException - PullRequest
0 голосов
/ 21 апреля 2019

В моем недавнем проекте у меня есть требование отправить нумерованный список.Я сделал нумерацию страниц в моем предыдущем проекте.Тогда я не столкнулся с какой-либо ошибкой.Но сейчас я не могу сделать нумерацию страниц в своем недавнем проекте.Я не знаю, что происходит не так.Я предоставляю свой код шаг за шагом.

Это мой класс контроллера, который возвращает пользовательский класс страницы

@GetMapping(value = "")
public CustomerResponsePage getCustomerList(@RequestParam Long agentId,
                                            @RequestParam(value = "page", defaultValue = "0") Integer page) {
    if (agentId == null)
        throw new NullValueException("Null value received for agentId");
    return customerService.getCustomersOfAgent(agentId, page);
}

Мой метод обслуживания

 @Override
    public CustomerResponsePage getCustomersOfAgent(Long agentId, Integer page) {
        User agent = userService.read(agentId);
        if (agent == null)
            throw new EntityNotFoundException("Agent with this id is not found");
        if (agent.getReferenceNo() == null)
            throw new EntityNotFoundException("No reference found for this agent");
        Page<User> customers = userRepository.findByReferenceNo(agent.getReferenceNo(),
                new PageRequest(page, PageAttr.PAGE_SIZE));
        List<UserDTO> dtoList = new ArrayList<>();
        for (User user : customers) {
            dtoList.add(customerMapper.customerResponseMapper(user));
        }
        System.out.println("Page is " + customers.getContent());
        System.out.println("List is " + dtoList);
        return new CustomerResponsePage(dtoList, customers);
    }

Мой пользовательский класс страницы

public class CustomerResponsePage implements Page {


    private List<UserDTO> content;
    private Pageable pageable;
    private boolean last;
    private Integer totalPages;
    private Long totalElements;
    private Integer size;
    private Integer number;
    private Integer numberOfElements;
    private boolean first;
    private Sort sort;

    public CustomerResponsePage(List<UserDTO> content, Page page) {
        this.content = content;
        this.pageable = page.getPageable();
        this.last = page.isLast();
        this.totalPages = page.getTotalPages();
        this.totalElements = page.getTotalElements();
        this.size = page.getSize();
        this.number = page.getNumber();
        this.numberOfElements = page.getNumberOfElements();
        this.first = page.isFirst();
        this.sort = page.getSort();

        System.out.println("content is " + content.toString());
        System.out.println("Page value is " + page.getTotalElements());
        System.out.println("Content is " + page.getContent());
    }

    public void setContent(List<UserDTO> content) {
        this.content = content;
    }

    @Override
    public Pageable getPageable() {
        return pageable;
    }

    @Override
    public int getTotalPages() {
        return this.totalPages;
    }

    @Override
    public long getTotalElements() {
        return this.totalElements;
    }

    @Override
    public Page map(Function function) {
        return null;
    }

    @Override
    public int getNumber() {
        return this.number;
    }

    @Override
    public int getSize() {
        return this.size;
    }

    @Override
    public int getNumberOfElements() {
        return this.numberOfElements;
    }

    @Override
    public List getContent() {
        return this.content;
    }

    @Override
    public boolean hasContent() {
        return this.content.size() > 0;
    }

    @Override
    public Sort getSort() {
        return this.sort;
    }

    @Override
    public boolean isFirst() {
        return this.first;
    }

    @Override
    public boolean isLast() {
        return this.last;
    }

    @Override
    public boolean hasNext() {
        return !this.isLast();
    }

    @Override
    public boolean hasPrevious() {
        return !this.isFirst();
    }

    @Override
    public Pageable nextPageable() {
        return null;
    }

    @Override
    public Pageable previousPageable() {
        return null;
    }

    @Override
    public Iterator iterator() {
        return null;
    }
}

Когда я нажимаю на почтальона, я получаю сообщение об ошибке типа enter image description here

И в консоли я получаю сообщение об ошибке типа

Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: (was java.lang.NullPointerException); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.sweetitech.capitalexpress.pageable.CustomerResponsePage["empty"])]

Обратите внимание, что внутри CustomerResponsePage printметод работает.

1 Ответ

1 голос
/ 21 апреля 2019

Трассировка стека относится к полю в CustomerResponsePage с именем empty.Проблема может быть связана с сериализацией этого поля или результатом его метода получения.

Если вам не нужно поле в выводе JSON, вы можете использовать @JsonIgnore, чтобы пропустить его.

[edit]

В вашем фрагменте a CustomerResponsePage создается вручную с использованием new CustomerResponsePage(dtoList, customers).Создавая вручную экземпляр, Spring не сможет обрабатывать нумерацию страниц, как обычно.

Я бы использовал функцию map, предоставляемую Page, вместо ручной итерации по объектам User для создания объектов.,Тогда вам не понадобится CustomerResponsePage в качестве оболочки для объектов, и вы можете вместо этого вернуть Page<UserDto>.

Page<User> customers = userRepository.findByReferenceNo(agent.getReferenceNo(),
            new PageRequest(page, PageAttr.PAGE_SIZE));

Page<UserDto> userDtos = customers.map(c -> customerMapper.customerResponseMapper(c));

return userDtos;
...