gpt4 book ai didi

Spring MVC + DeferredResult 添加 Hateoas 的东西

转载 作者:行者123 更新时间:2023-12-04 18:05:47 25 4
gpt4 key购买 nike

对于其余接口(interface),使用从 Controller 返回的 Spring MVC + RxJava + DeferredResult。

我正在考虑将 Hateoas 支持添加到端点。自然的选择是 Spring Hateoas。问题是 Spring Hateoas 不能在异步/多线程环境中工作,因为它使用 ThreadLocal。

有没有办法解决这个限制?我不这么认为,但也许有人有任何建议。

是否有人使用其他 API 将 Hateoas 支持添加到其余端点?

谢谢你。

最佳答案

所以我使用的解决方案是关闭请求属性,然后将它们作为电梯运算符(operator)的一部分应用

public class RequestContextStashOperator<T> implements Observable.Operator<T, T> {

private final RequestAttributes attributes;

/**
* Spring hateoas requires the request context to be set but observables may happen on other threads
* This operator will reapply the context of the constructing thread on the execution thread of the subscriber
*/
public RequestContextStashOperator() {
attributes = RequestContextHolder.currentRequestAttributes();
}
@Override
public Subscriber<? super T> call(Subscriber<? super T> subscriber) {
return new Subscriber<T>() {
@Override
public void onCompleted() {
subscriber.onCompleted();
}

@Override
public void onError(Throwable e) {
subscriber.onError(e);
}

@Override
public void onNext(T t) {
RequestContextHolder.setRequestAttributes(attributes);
subscriber.onNext(t);
}
};
}
}

然后您可以将其用于可观察的
lift(new RequestContextStashOperator<>())

只要对象是在与请求相同的线程中创建的。然后,您可以在可观察链中使用映射将您的对象映射为资源并添加您的 hatoas 链接。

关于Spring MVC + DeferredResult 添加 Hateoas 的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com