【问题标题】:How can I pass http session to DeferredResult?如何将 http 会话传递给 DeferredResult?
【发布时间】:2018-02-12 21:19:36
【问题描述】:

我有带有异步端点的 Spring MVC 应用程序:

@GetMapping
public DeferredResult<Collection<B>> get() {
    DeferredResult<Collection<B>> result = new DeferredResult<>();
    Executors.newSingleThreadExecutor().submit(() -> result.setResult(service.getB()));
    return result;
}

我正在尝试使用jackson-datatype-hibernate 序列化惰性对象:

@Entity
@Table
public class B {

    @Id
    @GeneratedValue
    private UUID id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private A a;

    public A getA() {
        return a;
    }
}

但我得到了:

Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.example.demo.B["a"])

【问题讨论】:

  • 错误与Hibernate Session有关,与HTTP Session无关;基本上,您还试图整理 B 类的 A a 属性,因为您有 Lazy 获取策略,您会收到错误
  • @AngeloImmediata 实际上,当我不尝试在新线程中执行任务时,它适用于 Callable 或 CompletableFuture。我使用 com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module 添加了带有自定义 ObjectMapper 的 bean MappingJackson2HttpMessageConverter。
  • 这很奇怪..错误很清楚,提取策略总是很清楚。您是否检查过它工作时的所有参数是否与不工作的测试相同?
  • @AngeloImmediata 是的,它绝对适用于 Callable 或仅适用于 Collection,即使没有 Eager fetch 类型或 JsonIgnore。
  • 所以最可能的原因是故障答案中指出的原因

标签: spring hibernate jackson threadpool lazy-evaluation


【解决方案1】:

我认为所指的会话是 Hibernate 会话而不是 HTTP 会话。

您的 POJO (B) 包含一个属性 (A a),该属性与 FetchType.LAZY 映射,因此当读取该属性时,Hibernate 会话必须打开且可用以满足延迟获取。

我怀疑您正在打开一个会话每个调用线程,并且由于响应是在不同的线程上处理的,因此休眠会话在 B 被序列化的线程上不可用。您必须将一些状态(可能通过创建可执行任务/运行程序)传递给创建延迟结果的线程,您可以扩展它以在您委托时包括当前打开的 Hibernate 会话(并记住在您有完成了那个线程)。或者,您也可以:

  • 在创建延迟结果的线程上打开一个新的 Hibernate 会话
  • 更改 FetchType 使其不再是惰性的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2020-07-19
    • 2011-07-24
    • 2012-06-02
    • 2023-04-03
    • 2018-07-11
    • 2023-03-29
    相关资源
    最近更新 更多