Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Fix issue with non-Optional generic parameters in controller methods throwing an exception #764

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
dpoineau wants to merge 2 commits into ninjaframework:develop
base: develop
Choose a base branch
Loading
from mangomint:ninja-generic-parameter-fix

Conversation

@dpoineau
Copy link

@dpoineau dpoineau commented May 31, 2025

We were upgrading from Ninja 5.8.0 to 7.0.0, and we ran into an issue where we had a controller method that took a List<String> as a method parameter. In this case the request body is a JSON array, so we allow the built-in JSON support to deserialize the body into that parameter (which worked fine on 5.8.0).

However, I discovered that some logic added to support Optional seemed to cause issues if the parameter was a non-Optional generic type, because getClass(genericType) would throw an exception:

java.lang.RuntimeException: Oops. Something went wrong while investigating method parameters for controller class invocation
	at ninja.params.ControllerMethodInvoker$MethodParameter.<init>(ControllerMethodInvoker.java:435)
	at ninja.params.ControllerMethodInvoker$MethodParameter.convertIntoMethodParameters(ControllerMethodInvoker.java:443)
	at ninja.params.ControllerMethodInvoker.build(ControllerMethodInvoker.java:118)
	at ninja.params.ControllerMethodInvokerTest.create(ControllerMethodInvokerTest.java:1304)
	at ninja.params.ControllerMethodInvokerTest.bodyWithGenericTypeShouldRun(ControllerMethodInvokerTest.java:1081)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod1ドル.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.mockito.internal.runners.DefaultInternalRunner1ドル1ドル.evaluate(DefaultInternalRunner.java:55)
	at org.junit.runners.ParentRunner3ドル.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner1ドル.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner4ドル.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner1ドル.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access100ドル(ParentRunner.java:66)
	at org.junit.runners.ParentRunner2ドル.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner3ドル.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.mockito.internal.runners.DefaultInternalRunner1ドル.run(DefaultInternalRunner.java:100)
	at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:107)
	at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:41)
	at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater1ドル.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:231)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by: java.lang.RuntimeException: Oops. That's a strange internal Ninja error.
Seems someone tried to convert a type into a class that is not a real class. ( java.util.List<java.lang.String>)
	at ninja.params.ControllerMethodInvoker$MethodParameter.getClass(ControllerMethodInvoker.java:454)
	at ninja.params.ControllerMethodInvoker$MethodParameter.<init>(ControllerMethodInvoker.java:432)
	... 37 more

xabolcs reacted with rocket emoji
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

1 more reviewer

@asolntsev asolntsev asolntsev approved these changes

Reviewers whose approvals may not affect merge requirements

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

AltStyle によって変換されたページ (->オリジナル) /