Vadim Beilin created CXF-9052:
---------------------------------
Summary: LoadDistributorFeature not comaptible with JAX-RS
subresources
Key: CXF-9052
URL: https://issues.apache.org/jira/browse/CXF-9052
Project: CXF
Issue Type: Bug
Components: JAX-RS
Affects Versions: 3.6.4, 4.0.5, 3.5.9
Reporter: Vadim Beilin
LoadDistributorTargetSelector seems to be confused by subresources.
I'm attaching a test that demonstrates it below.
When no clustering features or FailoverFeature is applied, the client tries to
invoke 'http://localhost:1234/sub/name', as expected. -- `noClustering` and
`failover` pass.
When LoadDistributorFeature is applied, the request is to
'http://localhost:1234/name' (path segment contributed by the root resource is
lost) -- `loadDistributor` fails.
---------------------------------------
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import java.util.List;
import org.apache.cxf.clustering.FailoverFeature;
import org.apache.cxf.clustering.LoadDistributorFeature;
import org.apache.cxf.clustering.SequentialStrategy;
import org.apache.cxf.feature.Feature;
import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
import org.junit.Assert;
import org.junit.Test;
public class ShowBug {
@Test
public void noClustering() {
makeRequest(List.of());
}
@Test
public void failover() {
var failover = new FailoverFeature();
failover.setStrategy(makeStrategy());
makeRequest(List.of(failover));
}
@Test
public void loadDistributor() {
var distro = new LoadDistributorFeature();
distro.setStrategy(makeStrategy());
makeRequest(List.of(distro));
}
private static SequentialStrategy makeStrategy() {
var s = new SequentialStrategy();
s.setAlternateAddresses(List.of("http://localhost:1234"));
return s;
}
private static void makeRequest(List<Feature> features) {
var fct = new JAXRSClientFactoryBean();
fct.setFeatures(features);
fct.setServiceClass(Root.class);
fct.setAddress("http://localhost:1234");
try {
fct.create(Root.class).sub().name();
} catch (Exception e) {
Assert.assertTrue(e.getMessage(),
e.getMessage().contains("/sub/name"));
}
}
interface Root {
@Path("/sub") Sub sub();
}
interface Sub {
@GET @Path("/name") String name();
}
}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)