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

RESTController:返回资源使FetchType.lazy的行为像FetchType.Eager一样

沈博延
2023-03-14
@Entity
public class Company{

    @Id
    private Integer companyId;

    private String name;

    @OneToMany(mappedBy = "company")
    private List<CompanyFund> companyFunds;

}

@Entity
public class CompanyFunds{

    @Id
    private Integer fundId;

    private String name;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "company_id")
  private Company company;

}
//controller
@GetMapping(value = "/{companyId}")
public Resource<Company> find(@PathVariable Integer companyId) {

  Resource<Company> companyResource = companyService.find(companyId);
  return companyResource;
}

//service
public Resource<CompanyTypeOther> find(Integer companyId) {
  Company company =  companyRepository.findById(companyId);

  return restResourceAssembler.toResource(company);
}


@Component
public class RestResourceAssembler implements ResourceAssembler<T, Resource<T>> {

    private EntityLinks entityLinks;

    public RestResourceAssembler(EntityLinks entityLinks) {
        this.entityLinks = entityLinks;
    }

    @Override
    public  Resource<T>  toResource(T entity) {
        Resource<T> resource = new Resource<>(entity);
        resource.add(entityLinks.linkToSingleResource(entity.getClass(), entity.getId()).withSelfRel());

        return resource;
    }
}
public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {

  ......

  public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,
    ........other code
    try {
      this.returnValueHandlers.handleReturnValue(
          returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
    }
    catch (Exception ex) {
      if (logger.isTraceEnabled()) {
        logger.trace(formatErrorForReturnValue(returnValue), ex);
      }
      throw ex;
    }
  }

  .....

}

我注意到的另一件事是,只有在返回资源 时才会出现此问题。如果我从控制器返回company,就不会发生意外情况。懒惰装载很好。

共有1个答案

丘友樵
2023-03-14

因为我想延迟加载实体,所以一个小的修复/黑客解决了这个问题(从现在开始)。

@JsonIgnore
@OneToMany(mappedBy = "company")
private List<CompanyFund> companyFunds;

@jsonignore防止序列化惰性加载实体。所以我猜杰克逊是这里的罪魁祸首。

这不是一个修复是我的观点,但只是一个黑客做的事情。仍在等待Spring团队的人回复。

 类似资料:
  • 我试图在JPanel上显示图片,但一直出现错误: Java语言lang.IllegalArgumentException:input==null! 我不明白发生了什么。 这是我正在使用的代码: 这只会导致我得到错误! 堆栈跟踪产生以下结果: 我如何解决这个问题?我已经检查了图像的位置,并且从不同的位置尝试,总是得到相同的错误! 我正在使用Netbean IDE。

  • 我正在构建我的第一个Spring Boot应用程序。但是我不能正确地得到我的requestMapping控制器的回答。 这是我的主要课程: 这是我的RestController: 如果我看一下日志,我可以看到“/hi”映射: 但是当我访问:http:localhost:8080/hi时,我看到了一个空白页面,我期望看到“Hello World”文本。 为什么我得到一个空白页面? ---编辑----

  • 我有base64字符串,我想使用Spring的RESTController在img标记上打印base64图像。 图像不输出。有什么问题?

  • 问题内容: 我有一个包含列表的类,并使用一对多的Hibernate映射将其映射,如下所示: 这些还具有一个field ,用于根据以下条件进行过滤: 这可以正常工作,并且结果符合预期。 现在 是我的问题 :为什么当我将fetch类型显式设置为时,s在结果列表中出现多次? 我如何更改我的Criteria代码才能在新设置下达到相同的结果? 问题答案: 如果我正确理解您的配置,这实际上是预期的行为。 您在

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 如何从PHP的MySql响应中“回显”“资源ID#6”? 我是php和SQL的新手,我正在尝试使php页面列出表中的枚举数。我正在使用此代码,但它返回资源ID#2: 问题答案: 因为执行时会获得mysql资源。 使用类似的方法来获取下一行。它返回一个以列名作为索引的数组。就您而言,可能是。 这是您的代码段的修复程序和一些小改进:

  • 问题内容: 我有一个包含列表的类,并使用一对多的映射将其映射,如下所示: 这些Order还具有一个,用于根据以下条件进行过滤: 这可以正常工作,并且结果符合预期。 现在是我的问题:为什么当我将访存类型显式设置为时EAGER,Orders在结果列表中出现多次? 我如何更改我的标准代码才能在新设置下达到相同的结果? 问题答案: 如果我正确理解你的配置,这实际上是预期的行为。 你Order在任何结果中都