Skip to content

Commit

Permalink
Prevent NPE in Jersey Spring RequestContextFilter
Browse files Browse the repository at this point in the history
Signed-off-by: jansupol <jan.supol@oracle.com>
  • Loading branch information
jansupol authored and senivam committed Apr 26, 2024
1 parent be13798 commit 132b55f
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 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
Expand Down Expand Up @@ -98,7 +98,9 @@ public void resetAttributes(final ContainerRequestContext requestContext) {
final AbstractRequestAttributes attributes =
(AbstractRequestAttributes) requestContext.getProperty(REQUEST_ATTRIBUTES_PROPERTY);
RequestContextHolder.resetRequestAttributes();
attributes.requestCompleted();
if (attributes != null) {
attributes.requestCompleted();
}
}
} : EMPTY_ATTRIBUTE_CONTROLLER;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* Copyright (c) 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
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/

package org.glassfish.jersey.server.spring.filter;

import org.glassfish.jersey.internal.inject.AbstractBinder;
import org.glassfish.jersey.internal.inject.InjectionManager;
import org.glassfish.jersey.internal.inject.Injections;
import org.glassfish.jersey.server.spring.scope.RequestContextFilter;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class SpringRequestContextFilterTest {
@Test
public void testMissingAttributes() throws IOException {
WebApplicationContext webAppCtx = (WebApplicationContext) Proxy.newProxyInstance(
WebApplicationContext.class.getClassLoader(),
new Class[]{WebApplicationContext.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});

InjectionManager injectionManager = Injections.createInjectionManager();
injectionManager.register(new AbstractBinder() {
@Override
protected void configure() {
bind(webAppCtx).to(ApplicationContext.class);
}
});
injectionManager.completeRegistration();

ContainerRequestContext requestContext = (ContainerRequestContext) Proxy.newProxyInstance(
ContainerRequestContext.class.getClassLoader(),
new Class[]{ContainerRequestContext.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});

RequestContextFilter filter = new RequestContextFilter(injectionManager);
filter.filter(requestContext, (ContainerResponseContext) null);
}
}

0 comments on commit 132b55f

Please sign in to comment.