当前位置: 首页 > 知识库问答 >
问题:

stackoverflow创建对象

乌俊健
2023-03-14

当我创建GET响应时,出现了Stackoveflow错误

应答控制器

@Controller
public class TaskViewController {

    @Autowired
    private TaskService taskService;

    @RequestMapping(value = "/task/view", method = RequestMethod.GET)
    public @ResponseBody
    AjaxResponseBody getTask(@RequestParam String text) {

        int id;
        AjaxResponseBody result = new AjaxResponseBody();
        Task task;
        System.out.println(text);

        try {
            id = Integer.parseInt(text);
        }
        catch (Exception e) {
            result.setMsg("Invalid task number");
            return result;
        }

        task = taskService.findById(id);

        if (task == null){
            result.setMsg("Task not found");
            return result;
        }

        result.setTask(task);
        return result;
    }
}

他用AjaxResponseBody类作为答案

public class AjaxResponseBody {

    private String msg;
    private Task task;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Task getTask() {
        return task;
    }

    public void setTask(Task task) {
        this.task = task;
    }
}

当这个控制器工作时,我捕捉到

2017-11-24 10:47:10.514 WARN 1448 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->tracker.models.Project_$$_jvstd06_4["user"]->tracker.models.User_$$_jvstd06_5["watched_project"]->

我是如何理解这种情况的,因为模型用户和模型项目彼此有链接。模型用户有一个可选字段“监视的项目”。

@Entity
@Table(name = "users")
public class User {
    @ManyToOne(fetch = FetchType.LAZY)
    private Project watched_project; 

    public Project getWatched_project() {
        return watched_project;
    }

    public void setWatched_project(Project watched_project) {
        this.watched_project = watched_project;
    }

并且模型项目具有字段,而不是empriy字段“author”:

@Entity
@Table(name = "projects")
public class Project {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private int id;
    @Column(nullable = false)
    @NotEmpty(message = "*Please provide project name")
    private String projectName;
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private User user;
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

我怎么能放弃它?还是其他方式?

共有1个答案

谢承
2023-03-14

JSON序列化尝试序列化对象,并且您有循环引用。关于这件事,有很多疑问。如果您使用的是Jackson,那么您可以对项目中的对象用户用户项目中的对象使用注释@JsonIgnore

此外,您还可以使用@JsonManagedReference@JsonBackReference类似于此答案。

 类似资料:
  • 问题内容: 运行此代码时,它将显示Stackoverflow错误。我做错了什么,为什么代码会编译? 问题答案: 您只能使用实例调用方法。所以在打电话开始之前,c’tor已经上课了 现在,C’tor设计为初始化所有实例成员。 因此,它将一一初始化: a初始化为5 f初始化为Object //,但这是陷阱,f从未初始化。 在操作员工作之前,将调用C’tor,从而使链继续进行。 如果您看到stacktr

  • 我调试了代码,变量“empresasucursal”嵌入了大量相同的信息,导致内存溢出。根据下图的数据库模型,正确的方法是什么 [![empresa_sucursal][1]][1] Java Empresa类 Java类 Java EmpresaSucursal类 控制器方法 控制台出错 017-04-17 10:05:10.442警告9788-[nio-8080-exec-1]。w、 s.m.

  • JavaScript对每个创建的对象都会设置一个原型,指向它的原型对象。 当我们用obj.xxx访问一个对象的属性时,JavaScript引擎先在当前对象上查找该属性,如果没有找到,就到其原型对象上找,如果还没有找到,就一直上溯到Object.prototype对象,最后,如果还没有找到,就只能返回undefined。 例如,创建一个Array对象: var arr = [1, 2, 3]; 其

  • 问题内容: 如何使用Google Gson创建json对象?以下代码创建一个看起来像的json对象 如何创建像这样的jSon对象? 问题答案: 弄清楚了如何使用Java对象正确执行此操作。 Creator java类的实现。

  • 问题内容: 我正在尝试学习python,现在我试图摆脱类的困扰,以及如何使用实例操作它们。 我似乎无法理解这个练习问题: 创建并返回其名称,年龄和专业与输入的对象相同的学生对象 我只是不明白对象的含义,是否意味着我应该在包含这些值的函数内创建一个数组?或创建一个类,然后将该函数放入其中并分配实例?(在问这个问题之前,我被要求开设一个学生班,里面要写姓名,年龄和专业) 问题答案: 请注意,即使Pyt

  • 虽然Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。为解决这个问题,人们开始使用工厂模式的一种变体。 6.2.1 工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现)。考虑到在ECMAScript 中无法创建类