Je pense que c'est un bug qui CXF obtenir l'URL de base incorrecte pour les services Web reposant. La classe "org.apache.cxf.transport.servlet.ServletController" appelle la méthode "getBaseURL" de la classe "org.apache.cxf.transport.servlet.BaseUrlHelper".
Il obtient l'URL de base à partir de l'URL de demande et ignore la partie paramètres. Cela est correct pour les services Web SOAP, car l'URL des services Web SOAP est semblable à: http://host:port/basepath?para=a
. Malheureusement, pour les services web reposants, l'URL est comme http://host:port/basepath/method/parameter
. L'URL de base correcte doit être http://host:port/basepath
, mais en réalité, BaseUrlHelper vous donne http://host:port/basepath/method/parameter
. Il donne juste l'URL avant "?" C'est pourquoi le résultat est correct lorsque vous accédez à http://localhost:8080/Rest/rest?_wadl
, dans ce cas, il donne l'URL de base correcte http://localhost:8080/Rest
.
Si vous accédez au http://localhost:8080/Rest/rest?_wadl
au début, alors vous accédez à http://localhost:8080/Rest/rest/retrieve
, ce serait correct. Parce que, CXF définir l'URL de base comme l'adresse de EndpointInfo seulement à la première fois. Cela signifie, vous devez accéder à l'URL de base correcte pour la première fois! :(
La solution est: remplacer la méthode "getBaseURL(HttpServletRequest request)" de "org.apache.cxf.transport.servlet.ServletController", laissez-le revenir URL de base correcte
Par exemple, l'étape 1. Étend la ServletController
.
public class RestfulServletController extends ServletController {
private final String basePath;
public RestfulServletController(DestinationRegistry destinationRegistry, ServletConfig config,
HttpServlet serviceListGenerator, String basePath) {
super(destinationRegistry, config, serviceListGenerator);
this.basePath = basePath;
}
@Override
protected String getBaseURL(HttpServletRequest request) {
// Fixed the bug of BaseUrlHelper.getBaseURL(request) for restful service.
String reqPrefix = request.getRequestURL().toString();
int idx = reqPrefix.indexOf(basePath);
return reqPrefix.substring(0, idx + basePath.length());
}
}
Etape 2: étend CXFNonSpringServlet et utiliser le RestfulServletController dans la sous-classe
public class RestfulCXFServlet extends CXFNonSpringServlet {
... ...
private ServletController createServletController(ServletConfig servletConfig) {
HttpServlet serviceListGeneratorServlet = new ServiceListGeneratorServlet(destinationRegistry, bus);
ServletController newController = new RestfulServletController(destinationRegistry, servletConfig,
serviceListGeneratorServlet, basePath);
return newController;
}
}
Etape 3: au lieu de CXFNonSpr ingServlet, vous utilisez la classe dérivée RestfulServletController. N'oubliez pas, vous devez configurer le "basePath" comme/Rest/rest.
J'espère que cela peut vous aider.
Pourriez-vous afficher votre classe Java? Il me semble que/retrieve ne correspond pas. Avez-vous fourni le type de méthode? – Jeroen