【问题标题】:Could not write JSON: (was java.lang.NullPointerException); nested exception is com.fasterxml.jackson.databind.JsonMappingException无法写入 JSON:(是 java.lang.NullPointerException);嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException
【发布时间】:2019-09-10 20:42:36
【问题描述】:

在我最近的项目中,我需要发送分页列表。我在早期的项目中进行了分页。然后我没有遇到任何错误。但是现在我不能在我最近的项目中进行分页。我不知道出了什么问题。我正在逐步提供我的代码。

这是我的控制器类,它返回一个自定义页面类

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

当我打邮递员时,我会收到类似的错误

在我的控制台中,我收到了类似

的错误
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 内部的打印方法正在工作。

【问题讨论】:

    标签: java spring-boot jpa pagination


    【解决方案1】:

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

    如果您的 JSON 输出中不需要该字段,您可以使用 @JsonIgnore 跳过它。

    [编辑]

    在您的 sn-p 中,CustomerResponsePage 是使用 new CustomerResponsePage(dtoList, customers) 手动实例化的。通过手动实例化,Spring 将无法正常处理分页。

    我会使用Page 提供的map 函数,而不是手动遍历User 对象来创建对象。那么您就不需要 CustomerResponsePage 作为对象的包装,而是可以返回 Page&lt;UserDto&gt;

    Page<User> customers = userRepository.findByReferenceNo(agent.getReferenceNo(),
                new PageRequest(page, PageAttr.PAGE_SIZE));
    
    Page<UserDto> userDtos = customers.map(c -> customerMapper.customerResponseMapper(c));
    
    return userDtos;
    

    【讨论】:

    • 在我的域类中,我在类的顶部添加了@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 以排除空字段。因此,当我检索数据库对象时,我没有得到任何空字段。
    • 如果方法的processed返回值为null,Jackson将忽略不将其添加到序列化响应中。 CustomerResponsePage 是否有名为 empty 的字段或名为 isEmptyempty 和/或 getEmpty 的方法?如果是,请验证方法处理时是否发生空指针异常。
    • 不,我在CustomerResponsePage 中没有名称为emptyisEmpty 的字段/方法。我已经发布了CustomerResponsePage。请检查。
    • CustomerResponsePage 实现Page。该属性可能在您的类实现的接口上。如果您使用org.springframework.data.domain.Page,则存在isEmpty 方法,因为接口Page 扩展了Streamable。在您的 sn-p 中,使用 new CustomerResponsePage(dtoList, customers) 手动实例化 CustomerResponsePage。通过手动实例化,Spring 可能无法像通常那样实例化字段。
    • 我已经更改了我的原始帖子并添加了一个示例,我无法在此评论中格式化一些演示代码。
    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2017-11-07
    • 2013-05-09
    相关资源
    最近更新 更多