diff --git a/src/main/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactory.java b/src/main/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactory.java index 7a113adc..1f966a6a 100644 --- a/src/main/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactory.java +++ b/src/main/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactory.java @@ -148,15 +148,14 @@ public class WebMvcLinkBuilderFactory implements MethodLinkBuilderFactory getConversionService() { + private static Supplier getConversionService() { return () -> { RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); - if (!ServletRequestAttributes.class.isInstance(attributes)) { - return null; + if (attributes == null || !ServletRequestAttributes.class.isInstance(attributes)) { + return FALLBACK_CONVERSION_SERVICE; } ServletContext servletContext = ((ServletRequestAttributes) attributes).getRequest().getServletContext(); diff --git a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java index ecc58736..34cd8cef 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java @@ -38,6 +38,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -625,6 +626,14 @@ class WebMvcLinkBuilderUnitTest extends TestUtils { assertThat(link.getHref()).endsWith("/api?view=short"); } + @Test // #118 + void usesFallbackConversionServiceIfNoContextIsCurrentlyPresent() { + + RequestContextHolder.setRequestAttributes(null); + + linkTo(methodOn(ControllerWithHandlerMethodParameterThatNeedsConversion.class).method(41L)).withSelfRel(); + } + private static UriComponents toComponents(Link link) { return UriComponentsBuilder.fromUriString(link.expand().getHref()).build(); } @@ -752,4 +761,11 @@ class WebMvcLinkBuilderUnitTest extends TestUtils { return ResponseEntity.noContent().build(); } } + + // #??? + interface ControllerWithHandlerMethodParameterThatNeedsConversion { + + @GetMapping("/{id}") + HttpEntity method(@PathVariable Long id); + } }