Elasticsearch“ org.springframework.http.converter.HttpMessageNotWritableException”

时间:2019-02-01 12:13:52

标签: java spring spring-boot elasticsearch jackson-databind

我试图运行这个简单的弹簧启动 - elasticsearch应用程序,但我得到这个 错误:当我GET /本地主机: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' 
}

我什么都试过,这个帖子里说的,但我仍然得到同样的错误。当我使用Maven时,我的代码可以完美运行。但是,当我使用Gradle时,会出现此错误。 我一直在寻找了几个小时来解决这个问题,但我还没有找到答案。谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我找到了答案! 令人惊讶的是,将其添加到 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);
    }

}