我的应用程序是一个有Angular 的web应用程序,通过hibernate和jpa从javaapi获取ressource。我将按照执行顺序粘贴相关代码,然后再粘贴错误(即使错误不是显式的)。
Angular 服务呼叫后端:
const API_URL = 'http://localhost:8080/communication/';
public getBugReports(): Observable<any> {
return this.http.get(API_URL + 'bugreport');
}
接收请求的java控制器:
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/communication/bugreport")
public class BugReportController {
@Autowired
BugReportRepository bugReportRepository;
@RequestMapping(value = "", method = RequestMethod.GET)
public List<BugReport> getBugReports() {
return bugReportRepository.findAll();
}
bugreportrepository是经典的,类扩展了jparepository<bugreport,integer>
实体错误报告:
@Entity
@Table(name="bugreport")
public class BugReport {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private int idBugReport;
@ManyToOne
@JoinColumn(name="idUser", nullable=false)
private User user;
private Date bugReportDate;
@Size(max = 1000)
private String text;
@ManyToOne
@JoinColumn( name="idSuggestionType" )
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private SuggestionType suggestionType;
... Constructors, getters/setters etc...
实体用户:
@Entity
@Table( name = "users",
uniqueConstraints = {
@UniqueConstraint(columnNames = "username"),
@UniqueConstraint(columnNames = "email")
})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idUser;
@NotBlank
@Size(max = 20)
private String username;
@NotBlank
@Size(max = 50)
@Email
private String email;
@NotBlank
@Size(max = 120)
private String password;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable( name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
@Column(name = "avatar", length = 1000)
private byte[] avatar;
@OneToMany(targetEntity = Suggestion.class, mappedBy="user")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Suggestion> suggestions = new ArrayList<>();
... Constructors, getters/setters etc...
实体建议:
@Entity @Table(name="suggestions")
public class Suggestion {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idSuggestion;
@ManyToOne
@JoinColumn(name="idUser", nullable=false)
@Cascade(CascadeType.ALL)
private User user;
private Date suggestionDate;
@Size(max = 1000)
private String text;
@ManyToOne
@JoinColumn( name="idSuggestionType" )
@Cascade(CascadeType.ALL)
private SuggestionType suggestionType;
... Constructors, getters/setters etc...
实体建议类型:
@Entity
@Table(name = "suggestion_types")
public class SuggestionType {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idSuggestionType;
@Enumerated(EnumType.STRING)
@Column(length = 30)
@Cascade(CascadeType.ALL)
private ESuggestionType name;
... Constructors, getters/setters etc...
前端错误:
HttpErrorResponse
error: {error: SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>) at XMLHttpRequest.onL…, text: "[{"idBugReport":1,"user":{"idUser":1,"username":"E…ggestions\"])","path":"/communication/bugreport"}"}
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
message: "Http failure during parsing for http://localhost:8080/communication/bugreport"
name: "HttpErrorResponse"
ok: false
status: 200
statusText: "OK"
url: "http://localhost:8080/communication/bugreport"
__proto__: HttpResponseBase
堆栈跟踪后端:
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:472) ~[tomcat-embed-core-9.0.24.jar:9.0.24]
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) ~[tomcat-embed-core-9.0.24.jar:9.0.24]
.
.
.
[Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.arnaudg.springjwt.models.User["suggestions"]
(the rest is not very relevant)
注意最后的stackoverflowerr,我认为我的jpaMap是错误的,特别是在manytomy,onetomany,jointable注解上。我是一个前端开发人员,所以我几乎是javajpa方面的Maven。
如果您在我的代码中发现任何错误或改进,请告诉我,我将非常高兴知道它。如果你想看另一节课,或者只是问我。谢谢大家
1条答案
按热度按时间iezvtpos1#
当控制器将响应发送回浏览器时,发生的json转换过程不理解
User
以及Suggestion
物体。user对象包含一个suggestion(list)对象,suggestion实体包含一个user对象。因此,在生成json时,转换运行到一个无限循环中。注解
suggestions
中的属性User
实体与@JsonManagedReference
注解和user
中的属性Suggestions
具有的实体@JsonBackReference
. 这将告诉json转换器关系的类型以及停止的位置。另见:Jackson-双向关系