REST API Spring Boot дает пустые строки - PullRequest
0 голосов
/ 07 марта 2019

Я новичок в Spring boot.У меня есть MYSQL таблица "customer" с данными, как показано: Данные в таблице При тестировании вывода API с помощью Postman, кажется, есть строки пустого вывода JSON.

Выход API

Ниже мой код:

package com.semika.customer;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="customer") 
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name="first_name")
    private String firstName;

    @Column(name="last_name")
    private String lastName;

    @Column(name="address")
    private String address;

    public Customer() {
       super();

    }

}

CustomerRepository

package com.semika.customer;

import org.springframework.data.repository.CrudRepository;

public interface CustomerRepository extends CrudRepository<Customer, Long>{

}

CustomerService

package com.semika.customer;

public interface CustomerService {
    public Iterable<Customer> findAll(); 
}

CustomerServiceImpl

package com.semika.customer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class CustomerServiceImpl implements CustomerService{

    @Autowired
    private CustomerRepository customerRepository;

    public Iterable<Customer> findAll() {
        return customerRepository.findAll(); 
    }
}

CustomerController

package com.semika.customer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CustomerController {
    @Autowired
    private CustomerService  customerService;

    @RequestMapping("/customers") 
    @ResponseBody
    public Iterable<Customer> findAll() {
       Iterable<Customer> customers = customerService.findAll();
       return customers;
    }
}

Я не знаю, что еще мне нужно изменитьв контроллере, чтобы иметь возможность увидеть вывод с данными.

Ответы [ 3 ]

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

На первый взгляд ваш код выглядит нормально. Итак, я скопировал ваш код и попытался запустить его и получил пустой ответ, как и вы. Потратив некоторое время, я понял причину.

Use getter and setter in you customer class and recompile the code.

Это решит вашу проблему. Также сделайте следующие изменения:

1) Annotate CustomerRepository with @Repository
2) use @EnableJpaRepositories("package path") in your application's main class if your repository is not in the same or sub package.
3) use method type or @GetMapping annotation in your controller.

Для вашего удобства я пишу ваш код после всех модификаций:

TestDemoApplication.java

    package testdemo;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

    @SpringBootApplication
    @EnableJpaRepositories("put repository path here")
    public class TestDemoApplication {

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

CustomerServiceImpl.java

package testdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class CustomerServiceImpl implements CustomerService{

    @Autowired
    private CustomerRepository customerRepository;

    public Iterable<Customer> findAll() {
        return customerRepository.findAll(); 
    }
}

CustomerService.java

package testdemo;

public interface CustomerService {
    public Iterable<Customer> findAll(); 
}

CustomerRepository.java

package testdemo;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CustomerRepository extends CrudRepository<Customer, Long>{

}

CustomerController.java

package testdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CustomerController {

    @Autowired
    private CustomerService  customerService;

    @GetMapping(value = "/customers") 
     public Iterable<Customer> findAll() {
       Iterable<Customer> customers = customerService.findAll();
       return customers;
    }
}

Customer.java

package testdemo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="customer") 
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name="first_name")
    private String firstName;

    @Column(name="last_name")
    private String lastName;

    @Column(name="address")
    private String address;

    public Customer() {
       super();

    }

    public Long getId() {
        return id;
    }

    public void setId(Long 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;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

Кроме того, CrudRepository возвращает Iterable <> в findAll (). Это JpaRepository, который возвращает List <>, так что не беспокойтесь об этом.

1 голос
/ 07 марта 2019

Вы использовали Iterable<Customer>.Пожалуйста, используйте List<Customer> вместо Iterable<Customer> везде.

0 голосов
/ 07 марта 2019

Вам может потребоваться перебрать набор данных и добавить результаты в List или, как сказал Вишал, изменить свои интерфейсы и реализации так, чтобы они возвращали List, а не Iterable.

package com.semika.customer;

import java.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class CustomerController {
    @Autowired
    private CustomerService  customerService;

    @RequestMapping("/customers") 
    @ResponseBody
    public Iterable<Customer> findAll() {
        List<Customer> results = new ArrayList<>();
        Iterator<Customer> iter = customerService.findAll().iterator();
        while (iter.hasNext()) results.add(iter.next());
        return results;
    }
}

В следующих сообщениях , Энди состояний,

Хотя List гарантированно будет Iterable, Iterable не может быть List. Это означает, что если вы приведете Iterable к List, он может потерпеть неудачу во время выполнения. Даже если он работает, нет гарантии, что он продолжит работать в будущем, поскольку он может измениться в новых версиях Spring Data JPA, не нарушая контракт интерфейса.

Вместо использования приведения вы должны объявить свои собственные методы запроса, которые возвращают List.

Также отмечается в этом посте, что вы можете использовать JpaRepository вместо CrudRepository, потому что JPA вернет List вместо Iterable, как указано здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...