弹簧控制器

时间:2017-10-02 18:16:46

标签: java spring rest

当结果是数组/列表时,我无法使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;
    }
}

2 个答案:

答案 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的便捷注释。