当结果是数组/列表时,我无法使spring序列化响应。
因此,当我从RestController调用clients
时,它确实返回[{},{},{}]
,而不是真实对象,所有其他方法都可以正常工作。
package com.test.Domain.Client;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.UUID;
@Entity
@Table(name = "client")
public class Client {
@Column(name = "client_id")
@Id
private UUID clientId;
@Column(name = "name")
private String name;
private Client() {
}
private Client(UUID clientId, String name) {
this.clientId = clientId;
this.name = name;
}
public static Client create(String name)
{
return new Client(UUID.randomUUID(), name);
}
}
package com.test.Rest;
import com.test.Domain.Calendar.AppointmentRepository;
import com.test.Domain.Client.Client;
import com.test.Domain.Client.ClientRepository;
import com.test.Domain.Worker.WorkerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@org.springframework.web.bind.annotation.RestController
public class RestController {
@Autowired
private ClientRepository clientRepository;
@Autowired
private WorkerRepository workerRepository;
@Autowired
private AppointmentRepository appointmentRepository;
@RequestMapping(path = "/client", method = RequestMethod.POST)
public void registerClient(@RequestParam(name = "name") String name) {
this.clientRepository.save(Client.create(name));
}
@RequestMapping(path = "/clientCount", method = RequestMethod.GET)
public Long countClient() {
return this.clientRepository.count();
}
@RequestMapping(path = "/clients", method = RequestMethod.GET)
@ResponseBody
public List<Client> clients() {
List<Client> list = new ArrayList<Client>();
for (Client client : this.clientRepository.findAll()) {
list.add(client);
}
return list;
}
}
答案 0 :(得分:2)
Jackson需要Getter和Setter方法才能将Client
对象正确地序列化为JSON。因此,返回空对象列表,并且缺少成员的值。将它们添加到Client
,响应应该看起来很好。
答案 1 :(得分:1)
在序列化对HttpMessageConverter
调用的响应时,Spring首先应用响应mime-type /clients
实现的首次注册。在您的情况下,这是一些JSON序列化程序。由于您没有在Client
类上指定JSON配置,因此使用默认的POJO序列化方法:对象属性的反射扫描。如前所述,Client
类没有定义任何属性(至少是getter),因此序列化程序不会检测任何属性。
有关更详细的说明,请参阅以下文章:https://www.javacodegeeks.com/2013/07/spring-mvc-requestbody-and-responsebody-demystified.html
P.S。在@ResponseBody
带注释的类中使用@RestController
标记方法不是必需的,因为它本身是一个汇总@Controller
和@ResponseBody
的便捷注释。