2012-06-03 17 views
28
Ben kök bağlamda benim JAX-RX Uygulama başlangıç ​​istiyorum

yüzden URL'lerimJAX-RS Kök bağlamında uygulama - nasıl yapılabilir?

http://example.com/restfullPath

ve ben bu

benim Uygulamanın ek açıklama geçmediniz

http://example.com/rest/restfullPath

olacak

@ApplicationPath("/rest/*") 

buna

@ApplicationPath("/*") 

Ama sonra o kök uygulama bağlamına JAX-RS çalıştırmak için bir yolu var mı ama hala statik sayfalar hizmet etmiş böyle /index.html

olarak sunum dosyalarını devraldı görünüyor?

bu JBOSS forumunda asked before oldu görünüyor, ama çözüm gerçekten pratik değildir

cevap

31

Bu, Servlet özelliklerinin bir sınırlaması olarak büyük ihtimalle bir hata değildir. Bir JAX-RS @ApplicationPath'un nasıl ele alındığına dair ayrıntılar uygulamaya özgüdür ve tüm uygulamalar için konuşamıyorum, ancak tipik yaklaşımın bunu bir sunucu URL modeli olarak kullanması olduğunu tahmin ediyorum. Jersey'in ServletContainerInitializer uygulamasına bir örnek olarak baktığınızda, addServletWithApplication() method ürününün, istekleri işlemek için sunucu uygulamasını ve eşleştirmeyi oluşturduğunu göreceksiniz ve bunun, gerçekte, Jersey ServletContainer olarak @ApplicationPath yolunu kullanacağını görebilirsiniz. eşlenmiş yol.

Maalesef, zaman geçtikçe, Servlet belirtimi, sunucu yollarının URL yollarına yalnızca küçük bir yolla eşleştirilmesine izin verdi. bölümü tarafından --sadly sadece PDF olarak kullanılabilir, yani bağlanabilir olmayan Section 12.2 of the spec verilen Servlet 3.0 ile şu anki seçenekler, - vardır: ilk /... sıfır ya da daha fazla yol elemanları

  • *.<ext> olan

    • /.../*<ext>
    • değil bir şey kolları bağlamında "varsayılan" sunucu uygulamasını gösterir boş yolu/bağlam kökü
    • /, tek bir bölü, sadece eşler boş dize, uygun olsun diye uzantısıdır başka bir şeyle eşleştir
    • bir hazır değer olarak muamele gören herhangi bir başka dize spec aynı bölümde ayrıca eşleştirme kuralları uygulamalıdır hangi sipariş için belirli kurallar vardır, ancak kısa versiyon şudur

    maç için: Kaynak sınıfında yanıt isteğinizi bağlam kökünde yapmak için, yol olarak / veya /*'u kullanmanız gerekir./ kullanırsanız, normalde statik kaynakların kullanılmasından sorumlu olacak şekilde, varsayılan olarak varsayılan sunucu uygulamasının yerini alırsınız. /*'u kullanırsanız, o zaman çok açgözlülük yapıyorsunuz ve her zaman her şeyle eşleşmesi gerektiğini söylüyorsunuz ve varsayılan sunucu hiçbir zaman çağrılmayacak.

    Servlet URL kalıplarının sınırlamaları tarafından belirlenen kutuda olduğumuzu kabul edersek, seçeneklerimiz oldukça sınırlıdır. İşte düşünebileceğimler:

    1) @ApplicationPath("/") kullanın ve statik kaynaklarınızı ad veya uzantının varsayılan sunucu uygulamasına (Tomcat ve Jetty'de "varsayılan" olarak adlandırılmış olarak adlandırın) diğerlerine göre açıkça eşleyin. Bir Web.xml, bu nedenle eşleme kuralları yazılır yol

    public class MyInitializer implements ServletContainerInitializer { 
        public void onStartup(Set<Class<?>> c, ServletContext ctx) { 
         ctx.getServletRegistration("default").addMapping("*.html"); 
         ctx.getServletRegistration("default").addMapping("/index.html"); 
        } 
    } 
    

    gibi

    <!-- All html files at any path --> 
    <servlet-mapping> 
        <servlet-name>default</servlet-name> 
        <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 
    <!-- Specifically index.html at the root --> 
    <servlet-mapping> 
        <servlet-name>default</servlet-name> 
        <url-pattern>/index.html</url-pattern> 
    </servlet-mapping> 
    

    gibi ya da ServletContextInitializer ile görünecektir, bir uzatma desen böylece, varsayılan servlet yener API'nizde meydana gelebilecek olanlar ile "uzantılar" arasında bir çakışma olmadığı sürece, yalnızca statik dosya uzantısı başına bir eşleme eklemeniz gerekir. Bu, bağlantı kurduğunuz forumda belirtilen istenmeyen seçeneğe oldukça yakındır ve ben sadece bütünlük için söz veriyorum ve ServletContextInitializer bölümünü ekleyeceğim. 2) API'nizi /rest/* ile eşlenmiş bırakın ve API için istekleri tanımlamak ve bu yola yönlendirmek için bir Filtre kullanın. Bu şekilde, servlet URL'si desen kutusundan çıkarsınız ve URL'leri istediğiniz şekilde eşleştirebilirsiniz. Örneğin, varsayarak tüm DİNLENME aramaları statik kaynaklar, gitmeli "/ bar" ve diğer tüm istekleri "/ foo" ile başlaması veya tam olarak ya yollara olduklarını sonra bir şey gibi: With

    import javax.servlet.*; 
    import javax.servlet.annotation.WebFilter; 
    import javax.servlet.http.HttpServletRequest; 
    import java.io.IOException; 
    import java.util.regex.Pattern; 
    
    @WebFilter(urlPatterns = "/*") 
    public class PathingFilter implements Filter { 
        Pattern[] restPatterns = new Pattern[] { 
          Pattern.compile("/foo.*"), 
          Pattern.compile("/bar"), 
        }; 
    
        @Override 
        public void doFilter(ServletRequest request, ServletResponse response, 
          FilterChain chain) throws IOException, ServletException { 
         if (request instanceof HttpServletRequest) { 
          String path = ((HttpServletRequest) request).getServletPath(); 
          for (Pattern pattern : restPatterns) { 
           if (pattern.matcher(path).matches()) { 
            String newPath = "/rest/" + path; 
            request.getRequestDispatcher(newPath) 
             .forward(request, response); 
            return; 
           } 
          } 
         } 
         chain.doFilter(request, response); 
        } 
    
        @Override 
        public void init(FilterConfig filterConfig) throws ServletException {} 
    
        @Override 
        public void destroy() {} 
    } 
    

    , Apache's mod_rewrite olarak, Tuckey rewrite filter veya ocpsoft Rewrite böyle varolan uygulama yeniden yazma URL

    http://example.org/foo   -> http://example.org/rest/foo 
    http://example.org/foox   -> http://example.org/rest/foox 
    http://example.org/foo/anything -> http://example.org/rest/foo/anything 
    http://example.org/bar   -> http://example.org/rest/bar 
    http://example.org/bart   -> http://example.org/bart 
    http://example.org/index.html -> http://example.org/index.html 
    

    3) bir önceki opsiyonu temelde anla ve kullanımı: yukarıdaki, aslında şöyle istekleri çevirir.

  • 1

    İç Jersey sınıflarını içeren başka bir çözüm buldum, muhtemelen JAX-RS özelliklerinin henüz bir parçası olmadığını düşünüyorum.

    web.xml

    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
        <display-name>jersey-rest-jsp-frame-1</display-name> 
    
        <filter> 
        <filter-name>jersey</filter-name> 
        <filter-class> 
         com.sun.jersey.spi.container.servlet.ServletContainer 
        </filter-class> 
        <init-param> 
         <param-name> 
         com.sun.jersey.config.property.JSPTemplatesBasePath 
         </param-name> 
         <param-value>/WEB-INF/jsp</param-value> 
        </init-param> 
        <init-param> 
         <param-name> 
         com.sun.jersey.config.property.WebPageContentRegex 
         </param-name> 
         <param-value> 
         (/(image|js|css)/?.*)|(/.*\.jsp)|(/WEB-INF/.*\.jsp)| 
         (/WEB-INF/.*\.jspf)|(/.*\.html)|(/favicon\.ico)| 
         (/robots\.txt) 
         </param-value> 
        </init-param> 
        </filter> 
        <filter-mapping> 
        <filter-name>jersey</filter-name> 
        <url-pattern>/*</url-pattern> 
        </filter-mapping> 
    </web-app> 
    

    WEB INF/JSP/index.jsp

    <%@ page contentType="text/html; charset=UTF-8" language="java" %> 
    
    <html> 
    <body> 
    <h2>Hello ${it.foo}!</h2> 
    </body> 
    </html> 
    

    IndexModel.java

    package example; 
    
    import com.sun.jersey.api.view.Viewable; 
    
    import javax.servlet.http.HttpServletRequest; 
    import javax.ws.rs.GET; 
    import javax.ws.rs.Path; 
    import javax.ws.rs.Produces; 
    import javax.ws.rs.core.Context; 
    import javax.ws.rs.core.MediaType; 
    import javax.ws.rs.core.Response; 
    import java.net.URI; 
    import java.util.HashMap; 
    
    @Path("/") 
    @Produces(MediaType.TEXT_HTML) 
    public class IndexModel { 
    
        @GET 
        public Response root() { 
         return Response.seeOther(URI.create("/index")).build(); 
        } 
    
        @GET 
        @Path("index") 
        public Viewable index(@Context HttpServletRequest request) { 
         HashMap<String, String> model = new HashMap<String, String>(); 
         model.put("foo","World"); 
         return new Viewable("/index.jsp", model); 
        } 
    } 
    
    : ( http://www.lucubratory.eu/simple-jerseyrest-and-jsp-based-web-application/ göre)

    Bu işe yarıyor gibi görünüyor, ama JAX-RS spesifikasyonunun/uygulamasının bir parçası olup olmayacağını merak ediyorum. Başka bir yazı

    den Jersey 2.0 @damo aktaran

    0

    "Alternatif olarak, yönlendirme çeşit şeyler koparmak mümkün olabilir. Örneğin bir Pre-matching Filter ile.Böyle bir şey yapmadım, ama belgelere "istek URI değiştirebilir hatta olabilir" düşündürmektedir."

    0

    Kullanım @ApplicationPath("/") yerine (yıldız işareti olmadan). Bu sizin durumda yardımcı olacaktır. Burada

    bir olduğunu numune DİNLENME web hizmeti:

    1. JaxRsActivator.java

    package com.stackoverflow; 
    
    import javax.ws.rs.ApplicationPath; 
    import javax.ws.rs.core.Application; 
    
    @ApplicationPath("/") 
    public class JaxRsActivator extends Application { 
    } 
    

    2. HelloService.java

    package com.stackoverflow; 
    
    import javax.ws.rs.GET; 
    import javax.ws.rs.Path; 
    import javax.ws.rs.Produces; 
    import javax.ws.rs.core.MediaType; 
    
    @Path("/hello") 
    public class HelloService { 
        @GET 
        @Produces(MediaType.TEXT_HTML) 
        public String hello() { 
         return "hello"; 
        } 
    } 
    

    Bu Dinamik Web projesini helloservice.war adlı bir WAR dosyasına dışa aktarmak ve yerel makinemde çalışan WildFly uygulamasına dağıtmak için Eclipse kullandım. URL'si: http://localhost:8080/helloservice/hello.

    iade Bu bağlantıya erişen:

    hello 
    
    +0

    Ben, bu soruya yanıt nasıl görmüyorum. Ama işte bu soruların cevapları şu şekildedir: meraklı biri: http://buraktas.com/resteasy-example-without-using-a-web-xml/ – Amalgovinus

    +0

    Deneyimlerime dayanarak yazdım. Bağlantınızın, kodumla aynı olduğunu düşündüğünüz herhangi bir kodu yok. Kodum genel bir şablon, belirli bir özel kod değil. İlan etmek istiyorsan, bunu yapmak için doğru yer burası değil. –