Quarkus中web套接字ClientEndpoint的构建时验证



我使用Java WebSocket API声明客户端(Java类由@ClientEndpoint注释(:

@ClientEndpoint
public class MySock {
MySock(ExecutorService exec){}
...
}

实例是通过构造函数创建的:

webSocket = new MySock(exec);
session = wsContainer.connectToServer(webSocket, url);

我在通过quarkus maven插件构建过程中出错:

[error]: Build step ...ArcProcessor#validate threw an exception: 
javax.enterprise.inject.UnsatisfiedResolutionException:
Unsatisfied dependency for type ...ExecutorService and qualifiers [@Default]
- java member: edu.MySock#<init>()
- declared on CLASS bean [types=[edu.MySock, java.lang.Object], qualifiers=[@Default, @Any], target=edu.MySock]

注意:没有@Inject注释

如果它可以作为类和实例传递给#connectToServer,是否应该对其进行验证?

那么,如果验证处理了一个悲观的情况,验证是有用的,但它破坏了一个乐观的情况,这可以吗?

悲观的情况,可能没有声明依赖关系:

session = wsContainer.connectToServer(MySock.class, url);

在以下情况下,验证是有害的,因为它破坏了构建阶段:

session = wsContainer.connectToServer(webSocket, url);

也许根本不应该验证ClientEndpoint?


在你问我之前。。。我们不会在WebSocket中注入一些东西,我们也不想使用程序化的端点。但是我们想要为带注释的类创建一个实例。为什么不呢?WebSocket在其内部封装了复杂的逻辑,我们多次使用这个变体(例如在WildFly上的应用程序中(。


对我来说,最好的解决方案是只禁用我的bean的验证,但我找不到如何做到这一点。

这篇文章对我没有帮助https://quarkus.io/guides/cdi-reference.beans.xml被忽略这一事实对我也没有帮助

未来的第二种方法是,如果没有一个类成员具有@Inject注释,则禁用验证。这可能不正确,但这里有一些解释:

首先,容器调用bean构造函数(默认构造函数或带注释的@Inject(,以获得bean的实例。

所以,我的构造函数不是"默认"的,我也没有使用@Inject注释

解决方法非常简单:@javax.enterprise.inject.Vetoed注释禁用bean进行验证。

相关内容

  • 没有找到相关文章

最新更新