2012-08-18 2 views
0

Je développe le service de repos JAX-RS en utilisant Apache CXF. Après l'avoir déployé sur le serveur Tomcat 7, si je tape l'URL http://localhost:8080/Rest/rest?_wadl, il me montre le WADL. mais si j'entre l'URL http://localhost:8080/Rest/rest/retrieve cela me donne l'erreur 404.Le service Jax-Rs n'est pas invoqué

Dans URL ci-dessus: Rest est le nom de mon projet /rest est le modèle d'URL pour mon CXFServlet qui est spécifié dans web.xml / est l'adresse de jaxrs:server qui est spécifié dans beans.xml retrieve est le chemin du service qui est spécifié dans mon interface avec l'annotation @Path.

(Mes excuses: je ne peux pas fournir les documents XML mentionnés ci-dessus.)

+0

Pourriez-vous afficher votre classe Java? Il me semble que/retrieve ne correspond pas. Avez-vous fourni le type de méthode? – Jeroen

Répondre

0

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.

Questions connexes