question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

JSON String as a Query Parameter throws error

See original GitHub issue
  • Framework version: 1.1
  • Implementations: Jersey

Scenario

I have a GET endpoint that takes in a String query parameter:


 @GET
    @Path("/search")
    @Produces(MediaType.APPLICATION_JSON)
    public Response list(@QueryParam("query") String queryStr) throws IOException {
        Map<String, String> response = new HashMap<>();
        response.put("body", queryStr);
        return Response.status(200).entity(response).build();
    }
}

When the endpoint is called with a simple string as a parameter it works as expected. For example .../search?query=helloWorld would work as expected. However, when the function is called with a JSON string as a parameter I am seeing an IllegalArgumentException. Making this call .../search?query={"name":"faisal"} would throw this error:

java.lang.IllegalArgumentException: Illegal character """ at position 7 is not allowed as a start of a name in a path template "query={"name":"faisal"}".

Expected behavior

The JSON string should be parsed as a string.

Actual behavior

The JSON string causes an IllegalArgumentException.

Steps to reproduce

  1. Define a GET endpoint that takes in a string as a query parameter
  2. Call endpoint with the parameter set to a JSON string.

Full log output

4310 [main] ERROR com.amazonaws.serverless.proxy.internal.LambdaContainerHandler - Error while handling request
java.lang.IllegalArgumentException: Illegal character """ at position 7 is not allowed as a start of a name in a path template "query={"name":"faisal"}".
	at org.glassfish.jersey.uri.internal.UriTemplateParser.parseName(UriTemplateParser.java:331)
	at org.glassfish.jersey.uri.internal.UriTemplateParser.parse(UriTemplateParser.java:256)
	at org.glassfish.jersey.uri.internal.UriTemplateParser.<init>(UriTemplateParser.java:115)
	at org.glassfish.jersey.uri.UriTemplate.createUriComponent(UriTemplate.java:1004)
	at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:970)
	at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:906)
	at org.glassfish.jersey.uri.UriTemplate.createURI(UriTemplate.java:871)
	at org.glassfish.jersey.uri.internal.JerseyUriBuilder._build(JerseyUriBuilder.java:914)
	at org.glassfish.jersey.uri.internal.JerseyUriBuilder.build(JerseyUriBuilder.java:831)
	at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.servletRequestToContainerRequest(JerseyHandlerFilter.java:141)
	at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.doFilter(JerseyHandlerFilter.java:86)
	at com.amazonaws.serverless.proxy.internal.servlet.FilterChainHolder.doFilter(FilterChainHolder.java:84)
	at com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler.doFilter(AwsLambdaServletContainerHandler.java:207)
	at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:171)
	at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:75)
	at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:168)
	at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:200)
	at com.lithium.tocoma.reach.handlers.AssetHandler.handleRequest(AssetHandler.java:23)
	at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888)
	at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:283)
	at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:64)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)
4316 [main] ERROR com.amazonaws.serverless.proxy.AwsProxyExceptionHandler - Called exception handler for:
java.lang.IllegalArgumentException: Illegal character """ at position 7 is not allowed as a start of a name in a path template "query={"name":"faisal"}".
	at org.glassfish.jersey.uri.internal.UriTemplateParser.parseName(UriTemplateParser.java:331)
	at org.glassfish.jersey.uri.internal.UriTemplateParser.parse(UriTemplateParser.java:256)
	at org.glassfish.jersey.uri.internal.UriTemplateParser.<init>(UriTemplateParser.java:115)
	at org.glassfish.jersey.uri.UriTemplate.createUriComponent(UriTemplate.java:1004)
	at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:970)
	at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:906)
	at org.glassfish.jersey.uri.UriTemplate.createURI(UriTemplate.java:871)
	at org.glassfish.jersey.uri.internal.JerseyUriBuilder._build(JerseyUriBuilder.java:914)
	at org.glassfish.jersey.uri.internal.JerseyUriBuilder.build(JerseyUriBuilder.java:831)
	at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.servletRequestToContainerRequest(JerseyHandlerFilter.java:141)
	at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.doFilter(JerseyHandlerFilter.java:86)
	at com.amazonaws.serverless.proxy.internal.servlet.FilterChainHolder.doFilter(FilterChainHolder.java:84)
	at com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler.doFilter(AwsLambdaServletContainerHandler.java:207)
	at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:171)
	at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:75)
	at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:168)
	at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:200)
	at com.lithium.tocoma.reach.handlers.AssetHandler.handleRequest(AssetHandler.java:23)
	at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888)
	at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:283)
	at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:64)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)
java.lang.IllegalArgumentException: Illegal character """ at position 7 is not allowed as a start of a name in a path template "query={"name":"faisal"}".
	at org.glassfish.jersey.uri.internal.UriTemplateParser.parseName(UriTemplateParser.java:331)
	at org.glassfish.jersey.uri.internal.UriTemplateParser.parse(UriTemplateParser.java:256)
	at org.glassfish.jersey.uri.internal.UriTemplateParser.<init>(UriTemplateParser.java:115)
	at org.glassfish.jersey.uri.UriTemplate.createUriComponent(UriTemplate.java:1004)
	at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:970)
	at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:906)
	at org.glassfish.jersey.uri.UriTemplate.createURI(UriTemplate.java:871)
	at org.glassfish.jersey.uri.internal.JerseyUriBuilder._build(JerseyUriBuilder.java:914)
	at org.glassfish.jersey.uri.internal.JerseyUriBuilder.build(JerseyUriBuilder.java:831)
	at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.servletRequestToContainerRequest(JerseyHandlerFilter.java:141)
	at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.doFilter(JerseyHandlerFilter.java:86)
	at com.amazonaws.serverless.proxy.internal.servlet.FilterChainHolder.doFilter(FilterChainHolder.java:84)
	at com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler.doFilter(AwsLambdaServletContainerHandler.java:207)
	at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:171)
	at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:75)
	at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:168)
	at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:200)
	at com.lithium.tocoma.reach.handlers.AssetHandler.handleRequest(AssetHandler.java:23)
	at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888)
	at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:283)
	at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:64)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)

Issue Analytics

  • State:closed
  • Created 5 years ago
  • Comments:9

github_iconTop GitHub Comments

1reaction
sapessicommented, Jun 15, 2018

I suspect it may have something to do with API Gateway/SAM CLI url-decoding the parameters and the library not re-encoding them before passing them to the framework. I’ll mark it as a bug and address it with the next release.

0reactions
sapessicommented, Jun 20, 2018

release 1.1.1 is going out to maven central

Read more comments on GitHub >

github_iconTop Results From Across the Web

Getting Error in JSON Parsing while sending an JSON object ...
Let's begin with the request. You cannot send a JSONObject directly to your server, you need to send it as a String and...
Read more >
SyntaxError: JSON.parse: bad parsing - JavaScript | MDN
JSON.parse() parses a string as JSON. This string has to be valid JSON and will throw this error if incorrect syntax was encountered....
Read more >
Is it a bad idea to pass JSON objects on the query string for an ...
We've implemented a few GET API calls using JSON in query string parameters. Currently we a struggeling with one of our client's IT ......
Read more >
How to require query parameter A OR parameter B and throw ...
This error is happening due to, the request is sending the values as normal strings, but based on the RAML spec, is expecting...
Read more >
ConvertFrom-Json (Microsoft.PowerShell.Utility)
The JSON string contains two key value pairs with keys that differ only in casing. Without the switch, the command would have thrown...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found