2016-07-03 17 views
0

私のJPAエンティティ(タスクとジョブ)の2つの双方向関係でネストされたループが原因で、Jacksonエラーが発生しました。 @JsonManagedReferenceアノテーションと@JsonBackReferenceアノテーションを使用してこれを解決するために調査を開始し、部分的に管理しましたが、このメソッドはJSONシリアライズで終了するエンティティ内の注釈をJobResource/JobResourceAssemblerおよびTaskResource/TaskResourceAssembler HATEOASlessとHALless jsonレスポンス。リソースとリソース・アセンブラを持つSpring HATEOAS/Jackson

リソースによって管理されているこのシリアライズ/デシリアライズを取得する方法はありますか?

いくつかのコード(この方法は、私はJSONレスポンスを得たが、HATEOASlessとHALlessであることのやり取りで):

@Entity 
public class Task { 

@Id 
@GeneratedValue 
private Long id; 

@OneToMany(mappedBy="task") 
@JsonManagedReference 
private List<Job> job = new ArrayList<Job>(); 

//constructors, getter, setter... 

@Entity 
public class Job { 

@Id 
@GeneratedValue 
private Long id; 

@ManyToOne 
@JsonBackReference 
@JoinColumn(name = "task_id", updatable = true, insertable = true, nullable = true) 
private Task task; 

//constructor, setter, getter. 

HATEOASless応答(ジョブがリンクを持っている必要があります)

{ 
"_embedded": { 
"tasks": [ 
    { 
    "name": "Task", 
    "description": "Task Description", 
    "createdAt": 1467583658749, 
    "updatedAt": null, 
    "deletedAt": null, 
    "isActive": true, 
    "estimatedStartDate": null, 
    "startDate": null, 
    "estimatedDateEnd": null, 
    "dateEnd": null, 
    "ids": 1, 
    "risk": null, 
    "job": [ 
     { 
     "id": 2, 
     "name": "Job", 
     "description": "Job Description", 
     "createdAt": 1467583673859, 
     "updatedAt": null, 
     "deletedAt": null, 
     "isActive": true 
     }, 
     { 
     "id": 3, 
     "name": "Job2", 
     "description": "Job Description", 
     "createdAt": 1467583676138, 
     "updatedAt": null, 
     "deletedAt": null, 
     "isActive": true 
     }, 
     { 
     "id": 4, 
     "name": "Job3", 
     "description": "Job Description", 
     "createdAt": 1467583679339, 
     "updatedAt": null, 
     "deletedAt": null, 
     "isActive": true 
     } 
    ], 
    "_links": { 
     "self": { 
     "href": "http://127.0.0.3:7890/api/v1/tasks/1" 
     }, 
     "task": { 
     "href": "http://127.0.0.3:7890/api/v1/tasks/1" 
     } 
    } 
    } 
] 

答えて

1

私はこれを解決しました私の同僚。第一に、問題はジャックソンが春のHATEOASのリソースを無視して、関連するエンティティを直接シリアル化していたことでした。私のリソースリストは、リソースではなく、通常のエンティティによってfeededされた状態で、我々はサービスを作っ

@Relation(collectionRelation = "tasks") 
public class TaskResource extends ResourceSupport { 

    private List<JobResource> job = new ArrayList<JobResource>(); 

、:私たちのリソースは、オブジェクトリスト、なしリソースリストでfeededされていたので、私たちはその変更されたため、これが発生しましたListジョブを通常のジョブで埋めることができます。

public List<JobResource> findJobsFromTask(Long id) { 

    Task task = taskRepository.findOne(id); 
    List<Job> jobs = task.getJob(); 
    List<JobResource> jobResourceList = new ArrayList<JobResource>(); 

    for (Job job : jobs) { 
     jobResourceList.add(new JobResourceAssembler().toResource(job)); 
    } 
    return jobResourceList; 
} 

このたが、私達はちょうどそれが新しいJobResourceが追加されますので、アセンブラを修正するために必要な::エンティティは基本的に同じである、独自のリソースを持っている場合なので、このプロセスは開発がかなり速かった

@Override 
public TaskResource toResource(Task task) { 
    taskResource.setJob(taskService.findJobsFromTask(task.getId())); 
} 

これが私たちのソリューションでした。より良いものがあれば、コメントや別の答えを残して議論してください。

編集:3つ以上のネストされたリソースがある場合は、手動ですべてをリソースに追加する必要があります。プロジェクト - >タスク - >ジョブの3つのリソースがあります。以前のアプローチを行った場合、ネストされたヌルエラーで終了します。サービス:

@Override 
public List<TaskResource> findTaskFromProject(Long id) { 

    Project project = projectRepository.findOne(id); 
    List<Task> tasks = project.getTask(); 
    List<TaskResource> taskResourceList = new ArrayList<TaskResource>(); 

    for (Task task : tasks) { 
     TaskResource taskResource = new TaskResource(); 
     taskResource.setName(task.getName()); 
     taskResource.setDescription(task.getDescription()); 
     taskResource.setCreatedAt(task.getCreatedAt()); 
     taskResource.setUpdatedAt(task.getUpdatedAt()); 
     taskResource.setDeletedAt(task.getDeletedAt()); 
     taskResource.setIsActive(task.getIsActive()); 
     taskResource.setRisk(task.getRisk()); 
     //taskResource.setDocumentState(task.getDocumentState()); 
     taskResource.setEstimatedStartDate(task.getEstimatedStartDate()); 
     taskResource.setStartDate(task.getStartDate()); 
     taskResource.setEstimatedDateEnd(task.getEstimatedDateEnd()); 
     taskResource.setDateEnd(task.getDateEnd()); 
     taskResource.setIds(task.getId()); 
     taskResource.setJob(taskService.findJobsFromTask(task.getId())); 
     taskResource.add(linkTo(TaskController.class).slash("").slash(task.getId()).withSelfRel()); 
     taskResource.add(linkTo(TaskController.class).slash("").slash(task.getId()).withRel("task")); 

     taskResourceList.add(taskResource); 
    } 

    return taskResourceList; 
} 

これで、私たちはプロジェクト - >仕事 - 仕事のJSON応答の完全なhateoas/halを取得しました。

関連する問題