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.
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
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. –