Wrap call of deprecated HttpServletResponse#setStatus into try catch
Signed-off-by: jansupol <jan.supol@oracle.com>
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java
index 038217d..d4d5fbc 100644
--- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java
+++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java
@@ -318,13 +318,33 @@
final Response.Status badRequest = Response.Status.BAD_REQUEST;
if (webComponent.configSetStatusOverSendError) {
response.reset();
- //noinspection deprecation
- response.setStatus(badRequest.getStatusCode(), badRequest.getReasonPhrase());
+ setStatus(response, badRequest.getStatusCode(), badRequest.getReasonPhrase());
} else {
response.sendError(badRequest.getStatusCode(), badRequest.getReasonPhrase());
}
}
+ /**
+ * <p>
+ * Set status and reason-phrase if the API still contains the method. Otherwise, only a status is sent.
+ * </p>
+ * <p>
+ * It can happen the Servlet 6 API is used and the method is not there any longer. A proprietary API can be used,
+ * or the class is transformed to Jakarta using some transformer means.
+ * </p>
+ * @param response the servlet {@link HttpServletResponse}
+ * @param statusCode the status code
+ * @param reasonPhrase the reason phrase
+ */
+ public static void setStatus(HttpServletResponse response, int statusCode, String reasonPhrase) {
+ try {
+ // noinspection deprecation
+ response.setStatus(statusCode, reasonPhrase);
+ } catch (NoSuchMethodError noSuchMethodError) {
+ response.setStatus(statusCode);
+ }
+ }
+
@Override
public void destroy() {
super.destroy();
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java
index ab4e927..5cd2f21 100644
--- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java
+++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java
@@ -404,8 +404,7 @@
if (configSetStatusOverSendError) {
servletResponse.reset();
- //noinspection deprecation
- servletResponse.setStatus(status.getStatusCode(), status.getReasonPhrase());
+ ServletContainer.setStatus(servletResponse, status.getStatusCode(), status.getReasonPhrase());
} else {
servletResponse.sendError(status.getStatusCode(), status.getReasonPhrase());
}
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/internal/ResponseWriter.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/internal/ResponseWriter.java
index 38301f8..e166fe1 100644
--- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/internal/ResponseWriter.java
+++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/internal/ResponseWriter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -37,6 +37,7 @@
import org.glassfish.jersey.server.ContainerResponse;
import org.glassfish.jersey.server.internal.JerseyRequestTimeoutHandler;
import org.glassfish.jersey.server.spi.ContainerResponseWriter;
+import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.spi.AsyncContextDelegate;
/**
@@ -144,7 +145,7 @@
final String reasonPhrase = responseContext.getStatusInfo().getReasonPhrase();
if (reasonPhrase != null) {
- response.setStatus(responseContext.getStatus(), reasonPhrase);
+ ServletContainer.setStatus(response, responseContext.getStatus(), reasonPhrase);
} else {
response.setStatus(responseContext.getStatus());
}
@@ -214,12 +215,12 @@
try {
if (!response.isCommitted()) {
try {
+ final int statusCode = Response.Status.INTERNAL_SERVER_ERROR.getStatusCode();
if (configSetStatusOverSendError) {
response.reset();
- //noinspection deprecation
- response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), "Request failed.");
+ ServletContainer.setStatus(response, statusCode, "Request failed.");
} else {
- response.sendError(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), "Request failed.");
+ response.sendError(statusCode, "Request failed.");
}
} catch (final IllegalStateException ex) {
// a race condition externally committing the response can still occur...