代码之家  ›  专栏  ›  技术社区  ›  Avijit Barua

无法写入JSON:(was java.lang.NullPointerException);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException

  •  0
  • Avijit Barua  · 技术社区  · 5 年前

    在我最近的项目中,我需要发送分页列表。我在以前的项目中进行了分页。然后我就没有面对任何错误。但是现在我不能在我最近的项目中进行分页。我不知道出了什么问题。我正在一步一步地提供我的代码。

    这是返回自定义页面类的控制器类

    @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

    1 回复  |  直到 5 年前
        1
  •  2
  •   Michiel    5 年前

    堆栈跟踪引用了中的一个字段 CustomerResponsePage empty . 问题可能与该字段的序列化或其getter方法的结果有关。

    如果JSON输出中不需要该字段,可以使用 @JsonIgnore

    [编辑]

    在您的代码片段中 CustomerResponsePage 使用 new CustomerResponsePage(dtoList, customers)

    我会使用 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;