spring-hateoas icon indicating copy to clipboard operation
spring-hateoas copied to clipboard

RepresentationModelProcessor nullpointer having mandatory field in controller spring 2.7.4

Open csigmanek opened this issue 3 years ago • 2 comments
trafficstars

Hello,

I have a ResourceProcessor that's adding links to a resource:

linkTo(methodOn(MyController.class)
  .findMyElements(file.getId(), null, null))
  .withRel("filterFiles"))

The controller looks like this:

@RequestMapping(method = { POST, GET }, value = "/myFiles/{fileId}/filterFiles")
  public List<FileDto> findFilterFiles(
      @PathVariable("fileId") final Long fileId,
      @RequestParam(name = "fileType") final Long fileType,
      @RequestBody(required = false) final FileFilterDto filter) { … }

In Spring 2.6.4, it used to work. Now, I've tried upgrading to 2.7.4, and it does not work anymore. I've tracked the issue down, and it seems like the required request parameter must not be null anymore.

I'm getting a null pointer exception with text like this: Illegal character in query at index 93: http://localhost:8080/files/10013/filterFiles?fileType={fileType} with the index pointing to '=' of fileType={fileType} .

Is it a bug? If yes - how can I fix it? Passing a constant number fixes the null-pointer exception:

linkTo(methodOn(MyController.class)
  .findMyElements(file.getId(), 1L, null))
  .withRel("filterFiles"))

but it leads to incorrect code.

csigmanek avatar Nov 09 '22 16:11 csigmanek

related stackoverflow issue: https://stackoverflow.com/questions/74400362/representationmodelprocessor-nullpointer-having-mandatory-field-in-controller-sp

csigmanek avatar Nov 11 '22 09:11 csigmanek

If I add some test code like this:

linkTo(methodOn(PersonControllerImpl.class).findFilterFiles(4711L, null, null)).withRel("foo").getHref()

I get the following output:

http://localhost/people/myFiles/4711/filterFiles?fileType={fileType}

The exception you show here seems to indicate that some code is trying to turn that String into a URI, which won't work as the curly braces demarcating the template variables are not valid characters in a URI. You will need to properly expand the URI template by providing a value for fileType to end up with a valid URI. Note that you won't be able to expand the template without a value for fileType as your controller method declares the parameter required which renders the template variable in non-optional syntax (?fileType} would be the optional one, but you'd have to set the required attribute on @RequestParam to false or turn the parameter type into an Optional<Long>.

odrotbohm avatar Jan 12 '23 07:01 odrotbohm