我使用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进行验证。