簡體   English   中英

RESTful servive:無法使用json返回對象數組

[英]RESTful servive : Unable to return array of object using json

該樣本是從通過 Google 發現的眾多樣本之一中提取的。 應用程序返回 3 個對象,但所有屬性均為 NULL。

下面是控制器對象。

import java.net.URI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

@RestController
@RequestMapping(path = "/employees")
public class EmployeeController 
{
    @Autowired
    private EmployeeDAO employeeDao;

    @GetMapping(path="/", produces = "application/json")
    public Employees getEmployees() 
    {
        return employeeDao.getAllEmployees();
    }

    @PostMapping(path= "/", consumes = "application/json", produces = "application/json")
    public ResponseEntity<Object> addEmployee(@RequestBody Employee employee) 
    {
        Integer id = employeeDao.getAllEmployees().getEmployeeList().size() + 1;
        employee.setId(id);

        employeeDao.addEmployee(employee);

        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                                    .path("/{id}")
                                    .buildAndExpand(employee.getId())
                                    .toUri();

        return ResponseEntity.created(location).build();
    }
}

這是通過 getEmployees 調用返回的 Employees 對象。

import java.util.ArrayList;
import java.util.List;

public class Employees 
{
    private List<Employee> employeeList;

    public List<Employee> getEmployeeList() {
        if(employeeList == null) {
            employeeList = new ArrayList<>();
        }
        return employeeList;
    }

    public void setEmployeeList(List<Employee> employeeList) {
        this.employeeList = employeeList;
    }
}

如果你需要它,這里是 DAO。

import org.springframework.stereotype.Repository;

@Repository
public class EmployeeDAO 
{
    private static Employees list = new Employees();

    static
    {
        list.getEmployeeList().add(new Employee(11, "Lokesh", "Gupta", "howtodoinjava@gmail.com"));
        list.getEmployeeList().add(new Employee(22, "Alex", "Kolenchiskey", "abc@gmail.com"));
        list.getEmployeeList().add(new Employee(33, "David", "Kameron", "titanic@gmail.com"));
    }

    public Employees getAllEmployees() 
    {
        return list;
    }

    public void addEmployee(Employee employee) {
        list.getEmployeeList().add(employee);
    }
}

根據要求,這里是 Employee 類。

import javax.annotation.ManagedBean;

import org.springframework.web.context.annotation.ApplicationScope;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

//@ManagedBean
//@ApplicationScope
//@Data

public class Employee {


    public Employee() {

    }
    public Employee(Integer id, String firstName, String lastName, String email) {
        super();
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    @Setter  @Getter  private Integer id;
    private String firstName;
    private String lastName;
    private String email;

    //Getters and setters

    @Override
    public String toString() {
        return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
    }
}

這是部分客戶端代碼....

    private static void getEmployees() 
    {

        // HttpHeaders
        HttpHeaders headers = new HttpHeaders();

        headers.setAccept(Arrays.asList(new MediaType[] { MediaType.APPLICATION_JSON }));
        // Request to return JSON format
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("my_other_key", "my_other_value");

        // HttpEntity<String>: To get result as String.
        HttpEntity<String> entity = new HttpEntity<String>(headers);

        // RestTemplate
        RestTemplate restTemplate = new RestTemplate();

        // Send request with GET method, and Headers.
        ///This works but only prints IDs.        
        ResponseEntity<String> response = restTemplate.exchange(URL_EMPLOYEES, HttpMethod.GET, entity, String.class);
        String result = response.getBody();
        System.out.println(result);

        HttpEntity<Employees> entity2 = new HttpEntity<Employees>(headers);
      ResponseEntity<Employees> eResponse = restTemplate.exchange(URL_EMPLOYEES, HttpMethod.GET, entity2, Employees.class);
      List <Employee> eList = eResponse.getBody().getEmployeeList();
      for (Employee e : eList)
      {
          System.out.println(e.toString());
      }
   }

從上面,下面的調用工作並打印出 3 個 ID。

    ResponseEntity<String> response = restTemplate.exchange(URL_EMPLOYEES, HttpMethod.GET, entity, String.class);
    String result = response.getBody();
    System.out.println(result);

返回 ID 后,下一步是使用下一組調用打印出每個員工的所有屬性。

  ResponseEntity<Employees> eResponse = restTemplate.exchange(URL_EMPLOYEES, HttpMethod.GET, entity, Employees.class);
  List <Employee> eList = eResponse.getBody().getEmployeeList();
  for (Employee e : eList)
  {
      System.out.println(e.toString());
  }

我在執行 LIST 調用的行上放置了一個斷點,並驗證了 eResponse 對象在列表中有 3 個項目,但所有 3 個項目都顯示它們的每個關聯屬性為 NULL。

由於我確認調用似乎正在工作,因為在第一次調用中返回了 ID,因此第二次調用缺少什么命令或設置以允許返回完整的對象?

我認為你應該刪除 super(); 在構造函數中。 我們使用它來訪問超類的成員。 您的 Employee 類沒有父類。

以下是為使其正常工作而更改的 3 個重要部分。

1 - 服務器端 - 此過程沒有真正改變。

@GetMapping(path="/", produces = "application/json")
public Employees getEmployees() 
{
    return employeeDao.getAllEmployees();
}

2 - 客戶端 - 簡化它。

private static void getEmployees() 
{

    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(new MediaType[] { MediaType.APPLICATION_JSON }));
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.set("my_other_key", "my_other_value");
    HttpEntity<Employee> entity = new HttpEntity<>(null,headers);
    ResponseEntity<String>result = restTemplate.exchange(URL_EMPLOYEES, HttpMethod.GET, entity, String.class);
    System.out.println(result);
 }

3 - 服務器端 - 這是讓它工作的關鍵。

最初 Employee.java 看起來像這樣。

@Setter  @Getter private Integer id;
private String firstName;
private String lastName;
private String email;

一旦我更改為以下內容,它就起作用了。

@Setter  @Getter private Integer id;
@Setter  @Getter private String firstName;
@Setter  @Getter private String lastName;
@Setter  @Getter private String email;

仍然不是 100% 的真實情況,但它有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM