[英]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.