2017-10-02 10 views
0

結果が配列/リストの場合、応答をシリアル化することができません。 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; 
    } 
} 
+1

ClientクラスでSerializableを実装しようとしましたか? –

答えて

2

ジャクソンはJSONに正しくClientオブジェクトをシリアル化するために、getterメソッドとsetterメソッドを必要とします。したがって、空のオブジェクトのリストが返され、メンバーの値が欠落しています。それらをClientに追加すると、応答は正常に表示されます。

+1

また、フィールドを['@JsonProperty'](https://fasterxml.github.io/jackson-annotations/javadoc/2.8/com/fasterxml/jackson/annotation/JsonProperty.html)に注釈を付けてください。 – Andreas

+0

それはトリックをした:) – Dariss

1

春は/clientsコールへの応答をシリアル化するときに応答MIMEタイプHttpMessageConverterの実装で最初に適用されます。あなたの場合、これはいくつかのJSONシリアライザです。 ClientクラスでJSON設定が指定されていないので、デフォルトのPOJOシリアライズアプローチが使用されます:オブジェクトプロパティのリフレクションスキャン。前述のように、あなたのClientクラスはプロパティ(少なくともgetter)を定義しないため、シリアライザは何も検出しません。

より詳細な説明については、次の資料を参照してください:https://www.javacodegeeks.com/2013/07/spring-mvc-requestbody-and-responsebody-demystified.html

P.S.注釈付きクラスの@ResponseBodyでのマーキング方法は、それ自体が便利な注釈であるため、@Controller@ResponseBodyを集約する必要はありません。