弹性搜索 "org.springframework.http.converter.HttpMessageNotWritableException"

Elasticsearch "org.springframework.http.converter.HttpMessageNotWritableException"

我正在尝试 运行 这个简单的 spring 启动 - elasticsearch 应用程序,但我得到这个 error 当我得到 /localhost:8080/findAll 时:

{
"timestamp": 1549021796136,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.http.converter.HttpMessageNotWritableException",
"message": "Could not write JSON: (was java.lang.NullPointerException); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl[\"facets\"])",
"path": "/findAll"}

我有非常简单的类和界面:

Customer.java

package com.example.demogradleNew.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(indexName = "christouandr", type = "customer", shards = 2)
public class Customer {

    @Id
    private String id;
    private String firstName;
    private String lastName;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

CustomerRepository.java

@Repository
public interface CustomerRepository extends ElasticsearchRepository<Customer, String> {
    List<Customer> findByFirstName(String firstName);
}

DemogradleNewApplication.java

package com.example.demogradleNew;

import com.example.demogradleNew.model.Customer;
import com.example.demogradleNew.repository.CustomerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@SpringBootApplication
@RestController
public class DemogradleNewApplication {

    @Autowired
    private CustomerRepository repository;

    @GetMapping("/findAll")
    public Iterable<Customer> findAllCustomers() {
        return repository.findAll();
    }

    @GetMapping("/findByName/{firstName}")
    public List<Customer> findByName(@PathVariable String firstName){
        return repository.findByFirstName(firstName);
    }

    @PostMapping("/saveCustomer")
    public int saveCustomer(@RequestBody List<Customer> customers){
        repository.save(customers);
        return customers.size();
    }


    public static void main(String[] args) {
        SpringApplication.run(DemogradleNewApplication.class, args);
    }

}

我的build.gradle文件如下:

buildscript {
    ext {
        springBootVersion = '1.5.19.BUILD-SNAPSHOT'
    }
    repositories {
        mavenCentral()
        maven { url 'https://repo.spring.io/snapshot' }
        maven { url 'https://repo.spring.io/milestone' }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'eclipse'


group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/snapshot' }
    maven { url 'https://repo.spring.io/milestone' }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'org.springframework.boot:spring-boot-devtools'
    compileOnly 'org.projectlombok:lombok' 
}

我尝试了 post 所说的一切,但我仍然遇到同样的错误。当我使用 Maven 时,我的代码运行完美。但是当我使用 Gradle 时,我得到了这个错误。 我一直在寻找解决这个问题的时间,但我还没有找到答案。谢谢!

好的伙计们,我找到答案了! 令人惊讶的是,将此添加到 DemogradleNewApplication.java 解决了问题!

import com.google.common.collect.Lists;

public List<Customer> findAll() {
    return Lists.newArrayList(repository.findAll());
}

因此,最终的 DemogradleNewApplication.java 文件如下所示!

package com.example.demogradleNew;

import com.example.demogradleNew.model.Customer;
import com.example.demogradleNew.repository.CustomerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import com.google.common.collect.Lists;


@SpringBootApplication
@RestController
public class DemogradleNewApplication {

    @Autowired
    private CustomerRepository repository;

    @GetMapping("/findAll")
    public List<Customer> findAll() {
        return Lists.newArrayList(repository.findAll());
    }
    @GetMapping("/findByName/{firstName}")
    public List<Customer> findByName(@PathVariable String firstName){
        return repository.findByFirstName(firstName);
    }

    @PostMapping("/saveCustomer")
    public int saveCustomer(@RequestBody List<Customer> customers){
        repository.save(customers);
        return customers.size();
    }


    public static void main(String[] args) {
        SpringApplication.run(DemogradleNewApplication.class, args);
    }

}