Skip to content

JSON String as a Query Parameter throws error #154

@aldilaff

Description

@aldilaff
  • 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)

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions