无法从JavaSpringAPI获取ressource,可能是jpa故障

bq8i3lrv  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(171)

我的应用程序是一个有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。
如果您在我的代码中发现任何错误或改进,请告诉我,我将非常高兴知道它。如果你想看另一节课,或者只是问我。谢谢大家

iezvtpos

iezvtpos1#

当控制器将响应发送回浏览器时,发生的json转换过程不理解 User 以及 Suggestion 物体。user对象包含一个suggestion(list)对象,suggestion实体包含一个user对象。因此,在生成json时,转换运行到一个无限循环中。
注解 suggestions 中的属性 User 实体与 @JsonManagedReference 注解和 user 中的属性 Suggestions 具有的实体 @JsonBackReference . 这将告诉json转换器关系的类型以及停止的位置。另见:Jackson-双向关系

相关问题