1

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

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

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

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

我在通过 quarkus-maven-plugin 构建过程中遇到错误:

[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-referencebeans.xml 被忽略的事实也对我没有帮助。

对于未来,第二种方法是在没有一个类成员带有 @Inject 注释的情况下禁用验证。它可能不正确,但这里有一些解释:

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

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

4

1 回答 1

1

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

于 2020-04-30T21:45:41.067 回答