Skip to content
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

IllegalArgumentException: Only Strings allowed in path parameters #1728

Open
hantsy opened this issue Sep 16, 2023 · 3 comments · May be fixed by #1782
Open

IllegalArgumentException: Only Strings allowed in path parameters #1728

hantsy opened this issue Sep 16, 2023 · 3 comments · May be fixed by #1782

Comments

@hantsy
Copy link
Contributor

hantsy commented Sep 16, 2023

I tried to upgrade my Spring Boot 3.1/Java 17 example to Spring Boot 3.2-M2 and Java 21, the restassured-mock-mvc test failed.

The example project: https://github.com/hantsy/spring6-sandbox/tree/master/boot

The failed tests: https://github.com/hantsy/spring6-sandbox/blob/master/boot/src/test/java/com/example/demo/web/PostControllerTestWithRestAssuredMockMvc.java

[ERROR] Tests run: 9, Failures: 0, Errors: 6, Skipped: 1, Time elapsed: 10.97 s <<< FAILURE! -- in com.example.demo.web.PostControllerTestWithRestAssuredMockMvc
[ERROR] com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testGetPostById -- Time elapsed: 0.591 s <<< ERROR!
java.lang.IllegalArgumentException: Only Strings allowed in path parameters.
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.lambda$validateUnnamedPathParams$1(MockMvcRequestSenderImpl.java:328)
        at java.base/java.util.Optional.ifPresent(Optional.java:178)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.validateUnnamedPathParams(MockMvcRequestSenderImpl.java:327)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.applyPathParams(MockMvcRequestSenderImpl.java:416)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.sendRequest(MockMvcRequestSenderImpl.java:347)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.get(MockMvcRequestSenderImpl.java:653)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.get(MockMvcRequestSenderImpl.java:105)
        at com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testGetPostById(PostControllerTestWithRestAssuredMockMvc.java:109)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

[ERROR] com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testDeletePostById_nonExisting -- Time elapsed: 0.038 s <<< ERROR!
java.lang.IllegalArgumentException: Only Strings allowed in path parameters.
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.lambda$validateUnnamedPathParams$1(MockMvcRequestSenderImpl.java:328)
        at java.base/java.util.Optional.ifPresent(Optional.java:178)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.validateUnnamedPathParams(MockMvcRequestSenderImpl.java:327)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.applyPathParams(MockMvcRequestSenderImpl.java:416)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.sendRequest(MockMvcRequestSenderImpl.java:347)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.delete(MockMvcRequestSenderImpl.java:677)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.delete(MockMvcRequestSenderImpl.java:105)
        at com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testDeletePostById_nonExisting(PostControllerTestWithRestAssuredMockMvc.java:264)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

[ERROR] com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testUpdatePost -- Time elapsed: 0.180 s <<< ERROR!
java.lang.IllegalArgumentException: Only Strings allowed in path parameters.
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.lambda$validateUnnamedPathParams$1(MockMvcRequestSenderImpl.java:328)
        at java.base/java.util.Optional.ifPresent(Optional.java:178)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.validateUnnamedPathParams(MockMvcRequestSenderImpl.java:327)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.applyPathParams(MockMvcRequestSenderImpl.java:416)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.sendRequest(MockMvcRequestSenderImpl.java:347)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.put(MockMvcRequestSenderImpl.java:669)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.put(MockMvcRequestSenderImpl.java:105)
        at com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testUpdatePost(PostControllerTestWithRestAssuredMockMvc.java:203)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

[ERROR] com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testGetPostById_nonExisting -- Time elapsed: 0.069 s <<< ERROR!
java.lang.IllegalArgumentException: Only Strings allowed in path parameters.
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.lambda$validateUnnamedPathParams$1(MockMvcRequestSenderImpl.java:328)
        at java.base/java.util.Optional.ifPresent(Optional.java:178)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.validateUnnamedPathParams(MockMvcRequestSenderImpl.java:327)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.applyPathParams(MockMvcRequestSenderImpl.java:416)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.sendRequest(MockMvcRequestSenderImpl.java:347)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.get(MockMvcRequestSenderImpl.java:653)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.get(MockMvcRequestSenderImpl.java:105)
        at com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testGetPostById_nonExisting(PostControllerTestWithRestAssuredMockMvc.java:131)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

[ERROR] com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testUpdatePost_nonExisting -- Time elapsed: 0.041 s <<< ERROR!
java.lang.IllegalArgumentException: Only Strings allowed in path parameters.
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.lambda$validateUnnamedPathParams$1(MockMvcRequestSenderImpl.java:328)
        at java.base/java.util.Optional.ifPresent(Optional.java:178)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.validateUnnamedPathParams(MockMvcRequestSenderImpl.java:327)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.applyPathParams(MockMvcRequestSenderImpl.java:416)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.sendRequest(MockMvcRequestSenderImpl.java:347)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.put(MockMvcRequestSenderImpl.java:669)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.put(MockMvcRequestSenderImpl.java:105)
        at com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testUpdatePost_nonExisting(PostControllerTestWithRestAssuredMockMvc.java:228)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

[ERROR] com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testDeletePostById -- Time elapsed: 0.038 s <<< ERROR!
java.lang.IllegalArgumentException: Only Strings allowed in path parameters.
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.lambda$validateUnnamedPathParams$1(MockMvcRequestSenderImpl.java:328)
        at java.base/java.util.Optional.ifPresent(Optional.java:178)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.validateUnnamedPathParams(MockMvcRequestSenderImpl.java:327)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.applyPathParams(MockMvcRequestSenderImpl.java:416)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.sendRequest(MockMvcRequestSenderImpl.java:347)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.delete(MockMvcRequestSenderImpl.java:677)
        at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.delete(MockMvcRequestSenderImpl.java:105)
        at com.example.demo.web.PostControllerTestWithRestAssuredMockMvc.testDeletePostById(PostControllerTestWithRestAssuredMockMvc.java:247)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

[INFO] 
[INFO] Results:
[INFO]
[ERROR] Errors: 
[ERROR]   PostControllerTestWithRestAssuredMockMvc.testDeletePostById:247 » IllegalArgument Only Strings allowed in path parameters.
[ERROR]   PostControllerTestWithRestAssuredMockMvc.testDeletePostById_nonExisting:264 » IllegalArgument Only Strings allowed in path parameters.
[ERROR]   PostControllerTestWithRestAssuredMockMvc.testGetPostById:109 » IllegalArgument Only Strings allowed in path parameters.
[ERROR]   PostControllerTestWithRestAssuredMockMvc.testGetPostById_nonExisting:131 » IllegalArgument Only Strings allowed in path parameters.
[ERROR]   PostControllerTestWithRestAssuredMockMvc.testUpdatePost:203 » IllegalArgument Only Strings allowed in path parameters.
[ERROR]   PostControllerTestWithRestAssuredMockMvc.testUpdatePost_nonExisting:228 » IllegalArgument Only Strings allowed in path parameters.
[INFO]
@mcdobr
Copy link

mcdobr commented Sep 25, 2023

It happens with Spring Boot 3.1.4 as well, since that upgrades to rest assured 5.3.2.

I changed the rest assured version to 5.3.1 and it works.

If validating unnamed path params is intended for this use case, then the methods like

io.restassured.module.mockmvc.internal.MockMvcRequestSpecificationImpl#get(java.lang.String, java.lang.Object...)
io.restassured.module.mockmvc.internal.MockMvcRequestSpecificationImpl#post(java.lang.String, java.lang.Object...)
etc.

should be deprecated and we should use the calls with Map<String, Object> instead, right?

@JanM-cz
Copy link

JanM-cz commented Nov 2, 2023

Well the calls with Map<String, Object> seem to just call map.values().toArray(new Object[map.values().size()]) under the hood. At least through spring-mock-mvc RestAssuredMockMvc. So if you don't use an ordered Map you even end up with mumbled up parameters.

Not to mention that the validation for "Only Strings allowed in path parameters." happens on both unnamed and named path parameters. So the Object based interfaces should be deprecated, because they seem to make no sense anymore.

@dcwik96
Copy link

dcwik96 commented Jan 15, 2024

Any news? Theres 5.4.0 version and still unnamed parameters are not working. I also have this problem. I use Spring Boot 3.2.0. Rest assured in version 5.4.0

@taeyeon-Kim taeyeon-Kim linked a pull request Apr 23, 2024 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants