【发布时间】:2019-07-29 16:22:35
【问题描述】:
用参数初始化注入的PasswordHash实例时,总是抛出空指针异常。
在线使用几个不同的示例,我总是得到相同的结果。这是我遵循的最新示例:https://medium.com/@swhp/explore-hash-feature-on-java-ee-security-jsr-375-soteria-7fe3b1953785。 IDE 说注入的 Pbkd2PasswordHash 具有“不满足的依赖关系:没有 bean 与注入点匹配”。这是有道理的,因为它是一个接口,我没有使用该接口创建一个新类。但是,我在网上看到的所有示例都在没有实现它的情况下注入了这个类。
如果我实现 PasswordHash 或 PBkdf2PasswordHash 接口并覆盖方法,我可以避免空指针,但这违背了传递具有特定迭代、算法、盐大小和/或密钥大小值的参数的目的.
@Inject
Pbkdf2PasswordHash pbkdfHash;
@PostConstruct
public void init() {
Map<String, String> parameters = new HashMap<>();
parameters.put("Pbkdf2PasswordHash.Iterations", "3072");
parameters.put("Pbkdf2PasswordHash.Algorithm", "PBKDF2WithHmacSHA512");
parameters.put("Pbkdf2PasswordHash.KeySizeBytes", "64");
parameters.put("Pbkdf2PasswordHash.SaltSizeBytes", "64");
this.pbkdfHash.initialize(parameters);
}
我希望当我用参数初始化注入的 PasswordHash 时,实例会自动对传入的文本进行哈希处理。因为看起来我没有注入任何 bean 而我只是注入了一个接口,所以它只返回一个空指针实例已初始化。
【问题讨论】:
-
-
根据你的标题,
System.out.println(this.pbkdfHash.toString())工作......它不工作吗?实际上,您很可能在类路径上只有一个 api 而不是一个实现。因此,您要么没有在经过 java-ee8 认证的服务器上运行(例如 java-ee7 的服务器),要么正在运行 servlet 容器并且自己没有包含实现,或者有一些 beans.xml 配置错误或... -
不,它没有......所有接口都需要一个真正的实现才能有效地有用(你不能实例化一个接口)。我并不是说你应该实现接口,一点也不。但是您需要在类路径上实现 An
-
快速浏览规范,似乎没有说实现必须为
Pbkdf2PasswordHash类型提供可注入的bean。这意味着它可以是特定于 impl 的。那些文章中提到的 Soteria,实际上将它作为一个 bean,从他们的代码 here 可以看出。而 Keycloak,作为另一个 impl,似乎有工厂,但没有 CDI bean,但我可能会遗漏一些东西。 -
这是我的快速搜索给我的 Keycloak 工厂的link。但就像我说的,他们可能会在其他地方自动添加它......
标签: java jakarta-ee cdi