2017-07-09 14 views
0

GETメソッドを呼び出そうとしているときにIllegalStateExceptionが発生していますが、何が問題なのかわかりません。以下のログを見ることができます。REST - java.lang.IllegalStateException:この応答に対してgetOutputStream()がすでに呼び出されています

https://pastebin.com/EC6CABcU - ログイン

package com.medicalsystem.controller; 

import com.medicalsystem.model.Admission; 
import com.medicalsystem.service.AdmissionService; 
import com.medicalsystem.service.PatientService; 
import lombok.AllArgsConstructor; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.web.bind.annotation.*; 

@RestController 
@AllArgsConstructor(onConstructor = @__(@Autowired)) 
public class AdmissionController { 

    private AdmissionService admissionService; 
    private PatientService patientService; 


    @RequestMapping(value = "/admission/{admissionId}", method = RequestMethod.GET) 
    public ResponseEntity<Admission> getAdmission(@PathVariable("admissionId") int admissionId) { 
     if (!admissionService.exists(admissionId)) { 
      return new ResponseEntity<>(HttpStatus.NOT_FOUND); 
     } 
     Admission admission = admissionService.getById(admissionId); 
     return new ResponseEntity<>(admission, HttpStatus.OK); 
    } 


    @RequestMapping(value = "/admission", method = RequestMethod.PUT) 
    public ResponseEntity<String> updateAdmission(@RequestBody Admission admission) { 
     admissionService.saveOrUpdate(admission); 
     return new ResponseEntity<>("Admission successfully added", HttpStatus.OK); 
    } 
} 
+0

スタックトレースでこれを検出しました。 "JSON文書を書くことができませんでした:無限再帰(StackOverflowError)"。病気と疾病の記述の間の双方向の関係を連載しようとしているのはジャクソンです。 @JsonIgnoreのJacksons注釈が参考になるかもしれません、良い記事[here](http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion)があります。 – GrumpyWelshGit

+0

@GrumpyWelshGitありがとう!できます。 – steeve

答えて

0

は入場料がEntityクラスである私には思えます。

import com.medicalsystem.model.Admission; 

Admission admission = admissionService.getById(admissionId); 

エンティティをWebサービスから直接返すことはお勧めできません。 エンティティは生きて管理することができるので、特別にマップされたゲッターメソッドへの呼び出しはすべて、関連するエンティティをロードします。また、jsonシリアライザのBeanはすべてのgetterメソッドを再帰的に呼び出してjson文字列を構築するので、エンティティが互いに参照するときにサイクリック呼び出しで終了します。あなたはどちらのログではっきりと見ることができる(にStackOverflowError)

java.lang.StackOverflowError: null 
at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_131] 
at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[na:1.8.0_131] 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_131] 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) ~[na:1.8.0_131] 
at java.net.URLClassLoader.access$100(URLClassLoader.java:73) ~[na:1.8.0_131] 
at java.net.URLClassLoader$1.run(URLClassLoader.java:368) ~[na:1.8.0_131] 
at java.net.URLClassLoader$1.run(URLClassLoader.java:362) ~[na:1.8.0_131] 
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_131] 
at java.net.URLClassLoader.findClass(URLClassLoader.java:361) ~[na:1.8.0_131] 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_131] 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_131] 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_131] 

レスポンスBeanを作成し、返されるフィールドを定義し、レスポンスBeanにエンティティから必要なデータを転送します。

関連する問題