Carsten,
What is the expectation regarding null request/response handling with
the
javax<->jakarta servlet conversion wrappers? It doesn't look like the
JavaxToJakartaResponseWrapper methods are annotated to indicate if
null is
allowed for the args and return values or not.
For example, I was trying to migrate my project to the latest
releases and
I ran into a scenario where it was using the (o.a.sling.auth.core)
AuthenticationSupport service in a JettyWebSocketCreator to handle
security
for a websocket upgrade request. The call
to authSupport.handleSecurity(httpRequest, null) used to work but now
down
the call stack it throws a ClassCastException when
the
org.apache.sling.api.wrappers.JakartaToJavaxResponseWrapper#toJavaxResponse
creates
the wrong type of object to wrap the null response arg. The
ServletResponseWrapper object it created can't be cast to
HttpServletResponseWrapper.
I was passing a null response argument because the
JettyServerUpgradeResponse in the JettyWebSocketCreator factory doesn't
expose the original http response anywhere.
I could workaround the problem by providing a mock response object
instead
of null, or can we try to make a null response argument work as it did
before?
For your reference, the top of the stack trace looked like this:
Caused by: java.lang.ClassCastException: class
org.apache.felix.http.javaxwrappers.ServletResponseWrapper cannot be
cast
to class javax.servlet.http.HttpServletResponse
(org.apache.felix.http.javaxwrappers.ServletResponseWrapper is in
unnamed
module of loader
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader @64e60e10;
javax.servlet.http.HttpServletResponse is in unnamed module of loader
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader @7646c397)
at
org.apache.sling.api.wrappers.JakartaToJavaxResponseWrapper.toJavaxResponse(JakartaToJavaxResponseWrapper.java:56)
[org.apache.sling.api:3.0.0]
at
org.apache.sling.auth.core.impl.AuthenticationHandlerWrapper$HandlerWrapper.extractCredentials(AuthenticationHandlerWrapper.java:64)
[org.apache.sling.auth.core:2.0.0]
at
org.apache.sling.auth.core.impl.AuthenticationHandlerHolder.doExtractCredentials(AuthenticationHandlerHolder.java:91)
[org.apache.sling.auth.core:2.0.0]
at
org.apache.sling.auth.core.impl.AbstractAuthenticationHandlerHolder.extractCredentials(AbstractAuthenticationHandlerHolder.java:57)
[org.apache.sling.auth.core:2.0.0]
at
org.apache.sling.auth.core.impl.SlingAuthenticator.getAuthenticationInfo(SlingAuthenticator.java:756)
[org.apache.sling.auth.core:2.0.0]
at
org.apache.sling.auth.core.impl.SlingAuthenticator.doHandleSecurity(SlingAuthenticator.java:513)
[org.apache.sling.auth.core:2.0.0]
at
org.apache.sling.auth.core.impl.SlingAuthenticator.handleSecurity(SlingAuthenticator.java:483)
[org.apache.sling.auth.core:2.0.0]
...
Regards,
Eric
On Thu, Jun 26, 2025 at 9:49 AM Carsten Ziegeler <cziege...@apache.org>
wrote:
Some of the modules in the release vote, e.g. engine, servlets post
have
such API as well - and for all of those I duplicated the API to be able
to write code using those APIs which does not rely on anything
deprecated.
The implementation (and same is true for the implementation of the API)
directly implements the Jakarta variant. The javax variant is usually
implemented by using wrappers and then invoking the Jakarta variant.
In most cases this is very straight forward, but I agree that its not
the nicest.
Regards
Carsten
On 26.06.2025 09:46, Stefan Seifert wrote:
with the release of Sling API 3.0.0 we have deprecated all API
interfaces based on the old servlet API, although they are still fully
working.
i suppose most of our other Sling modules' APIs have some reference to
SlingHttpServletRequest and similar baked in their own API (i'm
thinking
e.g. of Sling Models, Context-Aware configuration). although still
working,
they are all now referencing deprecated parts of the API, and should
give
users the opportunity to switch to latest Jakarta Servlet API.
does this mean we have to go through all of these modules, deprecated
all APIs which are "tainted" with old Servlet API references and
create a
new parallel interface with Jakarta servlet API and release a new major
version of the bundle; same as in the Sling API itself? that seems
to be
quite a lot of work, esp. keeping old and new versions of the
interfaces
running in parallel.
maybe it would be helpful to create a wiki page with recommendation
how
to create such a dual-faced API in the best-compatible way?
(most of the models in the correct voting process that are released
together with the API 3.0.0 do not have their own API, so we don't have
much blueprints except the Sling AIP 3.0.0 itself)
stefan
--
Carsten Ziegeler
Adobe
cziege...@apache.org