【问题标题】:Getting java.lang.NoSuchMethodException: io.jsonwebtoken.impl.crypto.MacProvider.generateKey only in case of jUnits获取 java.lang.NoSuchMethodException: io.jsonwebtoken.impl.crypto.MacProvider.generateKey 仅在 jUnits 的情况下
【发布时间】:2019-12-26 15:31:51
【问题描述】:

我最近开始出现以下异常,仅在运行 junit 时。在正常流程中,该方法运行良好。 (事实上​​,即使是以前的 jUnits 也能正常工作)

java.lang.NoSuchMethodException: io.jsonwebtoken.impl.crypto.MacProvider.generateKey(io.jsonwebtoken.SignatureAlgorithm)

方法如下:

public static String generateDummyJWT(String userName)
{
    return Jwts.builder().claim("user_name", StringUtils.defaultString(userName)).setAudience("client1").signWith(Keys.secretKeyFor(SignatureAlgorithm.HS384)).compact();   
}

和 jjwt 版本:

以下是完整的堆栈跟踪:

原因:java.lang.IllegalStateException:无法调用类 方法 io.jsonwebtoken.impl.crypto.MacProvider#generateKey。确保 必要的实现在运行时类路径中。在 io.jsonwebtoken.lang.Classes.invokeStatic(Classes.java:202) 在 io.jsonwebtoken.security.Keys.secretKeyFor(Keys.java:121) 在 com.random.util.ServiceSpecificUtil.generateDummyJWT(ServiceSpecificUtil.java:143) 在 com.random.util.ServiceConstants.(ServiceConstants.java:203) 在 com.random.MyClass.isUserBranch(MyClass.java:67) 在 com.random.MyClass.validName(MyClass.java:93) 在 com.random.MyClass.preConditionCheck(MyClass.java:82) 在 com.random.MyClass.get(MyClass.java:46) 在 com.random.MyClass2.evaluateExpression(MyClass2.java:218) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.powermock.api.mockito.internal.invocation.MockitoMethodInvocationControl$1.invoke(MockitoMethodInvocationControl.java:243) 在 org.mockito.internal.invocation.realmethod.CleanTraceRealMethod.invoke(CleanTraceRealMethod.java:30) 在 org.mockito.internal.invocation.InvocationImpl.callRealMethod(InvocationImpl.java:112) 在 org.mockito.internal.stubbing.answers.CallsRealMethods.answer(CallsRealMethods.java:41) 在 org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:93) 在 org.powermock.api.mockito.internal.invocation.MockitoMethodInvocationControl.performIntercept(MockitoMethodInvocationControl.java:266) 在 org.powermock.api.mockito.internal.invocation.MockitoMethodInvocationControl.invoke(MockitoMethodInvocationControl.java:192) 在 org.powermock.core.MockGateway.doMethodCall(MockGateway.java:132) 在 org.powermock.core.MockGateway.methodCall(MockGateway.java:63) 在 com.random.MyClass2.evaluateExpression(MyClass2.java) 在 com.random.MyClass2.isPermitted(MyClass2.java:107) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.powermock.api.mockito.internal.invocation.MockitoMethodInvocationControl$1.invoke(MockitoMethodInvocationControl.java:243) 在 org.mockito.internal.invocation.realmethod.CleanTraceRealMethod.invoke(CleanTraceRealMethod.java:30) 在 org.mockito.internal.invocation.InvocationImpl.callRealMethod(InvocationImpl.java:112) 在 org.mockito.internal.stubbing.answers.CallsRealMethods.answer(CallsRealMethods.java:41) 在 org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:93) 在 org.powermock.api.mockito.internal.invocation.MockitoMethodInvocationControl.performIntercept(MockitoMethodInvocationControl.java:266) 在 org.powermock.api.mockito.internal.invocation.MockitoMethodInvocationControl.invoke(MockitoMethodInvocationControl.java:192) ... 32 更多原因:java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 io.jsonwebtoken.lang.Classes.invokeStatic(Classes.java:198) ... 66 更多原因:java.lang.IllegalStateException:HmacSHA384 算法不可用。这绝不应该发生在 JDK 7 或 稍后 - 请将此报告给 JJWT 开发人员。在 io.jsonwebtoken.impl.crypto.MacProvider.generateKey(MacProvider.java:94) 在 io.jsonwebtoken.impl.crypto.MacProvider.generateKey(MacProvider.java:63) ... 71 更多原因:java.security.NoSuchAlgorithmException: HmacSHA384 KeyGenerator 不可用 javax.crypto.KeyGenerator.(KeyGenerator.java:169) 在 javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:223) 在 io.jsonwebtoken.impl.crypto.MacProvider.generateKey(MacProvider.java:92) ... 72 更多

【问题讨论】:

    标签: java junit jwt jjwt


    【解决方案1】:

    我能够解决我的问题。

    团队中有人在初始化静态最终变量时添加了对上述函数的调用,如下所示:

    public static String TOKEN_GUEST = ServiceSpecificUtil.generateDummyJWT(USERNAME);
    

    现在,由于大量使用反射和字节码操作,对 java.security 包的访问似乎通常不适用于PowerMock

    虽然我已经提到了this SO 帖子并尝试了使用的建议解决方案 @PowerMockIgnore点赞:

    @PowerMockIgnore({"org.apache.http.conn.ssl.*", "javax.net.ssl.*" , "javax.crypto.*"})
    

    当从另一个函数调用上述函数时,这可能有助于防止错误。但这并不能防止静态变量初始化中的错误。

    public static String TOKEN_GUEST = ServiceSpecificUtil.generateDummyJWT(USERNAME);
    

    当我深入研究为什么错误仅在静态变量初始化的情况下而不是在从另一个函数调用ServiceSpecificUtil.generateDummyJWT(USERNAME) 时出现时,我将更新这篇文章。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多