2016-11-14 23 views
2

現在、クライアントとジョブをサポートするSpring BootでREST APIを構築しようとしています。クライアントは多くのジョブを持つことができ、ジョブはクライアントに属します。私はCLIENT_IDまたはClientオブジェクトを見つけようとしていずれかのクライアントを参照してジョブを保存するときしかし、私はこのエラーを取得する:SpringブートでPOSTを介してエンティティ作成時の親への参照を作成する

仕事とクライアントのための私のモデルやコントローラなど
{ 
    "timestamp" : 1479163164739, 
    "status" : 400, 
    "error" : "Bad Request", 
    "exception" : "org.springframework.http.converter.HttpMessageNotReadableException", 
    "message" : "Could not read document: Can not construct instance of com.core.model.Client: no String-argument constructor/factory method to deserialize from String value ('3')\n at [Source: [email protected]; line: 1, column: 12] (through reference chain: com.core.model.Job[\"client\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.core.model.Client: no String-argument constructor/factory method to deserialize from String value ('3')\n at [Source: [email protected]; line: 1, column: 12] (through reference chain: com.core.model.Job[\"client\"])", 
    "path" : "/api/v1/jobs" 
} 

仕事のための私のモデル:仕事のための

package com.core.model; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.CascadeType; 
import javax.persistence.Table; 
import javax.persistence.Column; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Id; 

@Entity 
@Table(name="`job`") 
public class Job { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="job_id") 
    private Long jobId; 

    @ManyToOne(cascade=CascadeType.ALL, targetEntity = Client.class) 
    @JoinColumn(name = "client_id", nullable = false) 
    private Client client; 

    private String address1; 
    private String address2; 
    private String city; 
    private String county; 
    private String state; 
    private String zip; 
    private String country; 
    private String description; 

    //Note: I tried Long client_id instead of using the Client object here and same thing 
    public Job(String description, String address1, String address2, String city, String county, 
       String state, String zip, String country, Client client) { 
     this.setDescription(description); 
     this.setAddress1(address1); 
     this.setAddress2(address2); 
     ... 
     this.setClient(client); 
    } 

    public Job() {} 

    public Long getId() { return jobId; } 
    public void setId(Long id) { this.jobId = id; } 
    ... 
    public Client getClient() { return client; } 
    public void setClient(Client client) { this.client = client; } 

} 

コントローラー:

package com.core.controller; 

import com.core.model.Job; 
import com.core.repository.JobRepository; 
import org.apache.catalina.connector.Response; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.web.bind.annotation.*; 
import com.core.repository.JobRepository; 
import org.springframework.hateoas.Resource; 

import java.util.Collection; 
import java.util.List; 

@RestController 
@RequestMapping("/api/v1/jobs") 
public class JobController { 

    @Autowired 
    private JobRepository repository; 

    @RequestMapping(method = RequestMethod.GET) 
    public ResponseEntity<Collection<Job>> getAllJob(){ 
     return new ResponseEntity<>((Collection<Job>) repository.findAll(), HttpStatus.OK); 
    } 
    @RequestMapping(method = RequestMethod.GET, value = "/{id}") 
    public ResponseEntity<Job> getEquipmentWithId(@PathVariable Long id) { 
     return new ResponseEntity<>(repository.findOne(id),HttpStatus.OK); 
    } 

    @RequestMapping(value="", method=RequestMethod.POST) 
    public ResponseEntity createNew(@RequestBody Job job) { 
     repository.save(job); 
     return new ResponseEntity(job, HttpStatus.CREATED); 
    } 
} 

とクライアントモデル:

クライアントIDをジョブに保存したいだけですが、ここで正しいアプローチは何ですか?

+0

あなたはあなたの要求を表示することができます – kuhajeyan

答えて

1

私の推測では、あなたがRESTを使用してこのメ​​ソッドを呼び出すしようとしているということである:Thの例外はかなり明確である

@RequestMapping(value="", method=RequestMethod.POST) 
public ResponseEntity createNew(@RequestBody Job job) { 
     repository.save(job); 
     return new ResponseEntity(job, HttpStatus.CREATED); 
} 

、それは語る:

com.fasterxml.jackson.databind.JsonMappingException 

あなたがしている時はいつでもことを意味していますリクエスト本体内でJobエンティティを渡そうとすると、JacksonはそれをメソッドコントローラのJob jobパラメータにバインドできません。

私の提案は、ジャクソンdeserializerクラスを書くことです。これはジャクソンに、逆シリアル化を正確に行う方法を伝えます。

は、ここでそれを行う方法の例です:

Right way to write JSON deserializer in Spring or extend it

+0

クール、大丈夫。そこで私はJobエンティティ用のデシリアライザとシリアライザを作ったので、その例のようにclient_idの値を取得することができました。私は私の質問だと思う:ここからは、(長い)client_idで新しいジョブオブジェクトをインスタンス化し、そのように保存しようとするだけで(クライアントオブジェクトの代わりにメンバとしてclient_idを使用する)、またはClientオブジェクトをインスタンス化する必要がありますIDが渡されたオブジェクトを見つけようとしてから、新しいJobを子としてClientに追加する何かをしますか? – albaba

+0

私は後者と一緒に行きました!春に新しくORMの異なる世界から来て、とても助けてくれてありがとう! – albaba

+1

乾杯;-)問題ありません –

関連する問題