diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverters.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverters.java index 8fdfca9de06..3247d2425d3 100644 --- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverters.java +++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018 Payara Foundation and/or its affiliates. * * This program and the accompanying materials are made available under the @@ -279,11 +279,15 @@ public T fromString(String value) { } else { final List ctps = ReflectionHelper.getTypeArgumentAndClass(genericType); final ClassTypePair ctp = (ctps.size() == 1) ? ctps.get(0) : null; - + final boolean empty = value.isEmpty(); for (ParamConverterProvider provider : Providers.getProviders(manager, ParamConverterProvider.class)) { final ParamConverter converter = provider.getConverter(ctp.rawClass(), ctp.type(), annotations); if (converter != null) { - return (T) Optional.of(value).map(s -> converter.fromString(value)); + if (empty) { + return (T) Optional.empty(); + } else { + return (T) Optional.of(value).map(s -> converter.fromString(value)); + } } } /* @@ -322,7 +326,7 @@ public ParamConverter getConverter(Class rawType, Type genericType, An @Override public T fromString(String value) { - if (value == null) { + if (value == null || value.isEmpty()) { return (T) optionals.empty(); } else { return (T) optionals.of(value); diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/OptionalParamConverterTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/OptionalParamConverterTest.java index 0734c550fcb..695fbed4325 100644 --- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/OptionalParamConverterTest.java +++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/OptionalParamConverterTest.java @@ -156,8 +156,8 @@ public void fromOptionalDate() { Response invalid = target("/OptionalResource/fromDate").queryParam(PARAM_NAME, "invalid").request().get(); assertEquals(200, missing.getStatus()); assertEquals(new Date(1609459200000L), missing.readEntity(Date.class)); - assertEquals(404, empty.getStatus()); - assertFalse(empty.hasEntity()); + assertEquals(200, empty.getStatus()); + assertEquals(new Date(1609459200000L), empty.readEntity(Date.class)); assertEquals(200, notEmpty.getStatus()); assertEquals(new Date(1619870400000L), notEmpty.readEntity(Date.class)); assertEquals(404, invalid.getStatus()); @@ -173,8 +173,8 @@ public void fromOptionalInstant() { Response invalid = target("/OptionalResource/fromInstant").queryParam(PARAM_NAME, "invalid").request().get(); assertEquals(200, missing.getStatus()); assertEquals("2021-01-01T00:00:00Z", missing.readEntity(String.class)); - assertEquals(404, empty.getStatus()); - assertFalse(empty.hasEntity()); + assertEquals(200, empty.getStatus()); + assertEquals("2021-01-01T00:00:00Z", empty.readEntity(String.class)); assertEquals(200, notEmpty.getStatus()); assertEquals("2021-05-01T12:00:00Z", notEmpty.readEntity(String.class)); assertEquals(404, invalid.getStatus());