2011-07-13 35 views
7

Tomcat Apache 6.0 ortamında çalışan Bahar 3.0 kullanılarak bir sığınakta hizmeti geliştiriyorum tüm kontrolör sınıfların URL'ler öneki ekleyin. Spring DispatcherServlet "/ spring/*" olarak yapılandırılmıştır. Spring servlet birden fazla istemciyi işler ve uygulamada birçok Denetleyiciye sahiptir. REST servisi için yeni bir Controller ekliyorum.
http://<server>:<port>/<context>/spring/ws/service1paketin

Spring açıklama ile bulunan tek yolu şudur: bir kaynağa tam URL şuna benzer böylece "ws" (web hizmeti) gibi bir tanımlama öneki için benim denetleyicisi sınıflarının hepsini istiyorum

@Controller 
@RequestMapping("/ws/service1") 
public class Service1 { 

@RequestMapping(method=RequestMethod.GET) 
@ResponseBody 
public String getHtml() { ... } 

.... 
} 

Ama sınıfların onlarca beri, ben her sınıfta "/ ws" öneki koymak istemiyorum: böyle @ RequestMapping kullanın. başka bir geliştirici yeni bir hizmet eklerse Böylece, o bu önek koymak ve bunu başka bir şeye "/ ws" dan önek adını değiştirmeye karar verirseniz de, ben tüm dosyaları değiştirmek gerekmez hatırlamak zorunda değildir. @RequestMapping ek açıklamasının yalnızca Paketler veya Sınıflar için geçerli olduğunu ve paket düzeyinde olmadığını tespit ettim.

Ben bütün DİNLENME Kontrolörler öneki ile erişilen olduğunu yapılandırabilirsiniz bir yolu var mı?

Bu URL'ye sahip çalışan diğer Kontrolörler vardır beri Bahar servlet web.xml URL eşlemesi değiştiremezsiniz unutmayın.

+0

Sizin son cümle çok önemlidir - Eğer "Diğer kontrolörler" ile ne demek genişletebilirdik? – skaffman

+0

Spring servlet bir Flex istemcisine hizmet veriyor ve bunun için BlazeDS denetleyicisini kullanıyorum. Tomcat sunucusunun kendisi de bazı statik içerik sunmak zorunda. RESTful denetleyici buna ek olarak. Bu yüzden, Bahar sunucu URL'sini "/ *" veya "/ ws/*" ile eşleyemiyorum. – Shreerang

cevap

5

Sen Özellikle ControllerClassNameHandlerMapping, Bahar 3'ün convention over configuration desteği bakmak isteyebilirsiniz. Etkili bir şekilde, URL'nin konumunu @RequestMapping'da tanımlamazsınız, ancak işleyicinin paket konumuyla tanımlanır.

Eşlenen URL'lerin denetleyici paket adını yansıtmasını istiyorsanız, ControllerClassNameHandlerMapping'un basePackage özelliğini ayarlamalısınız. documentation

Set the base package to be used for generating path mappings, including all subpackages underneath this packages as path elements. Default is null, using the short class name for the generated path, with the controller's package not represented in the path. Specify a base package like "com.mycompany.myapp" to include subpackages within that base package as path elements, e.g. generating the path "/mymodule/buyform" for the class name "com.mycompany.myapp.mymodule.BuyForm". Subpackage hierarchies are represented as individual path elements, e.g. "/mymodule/mysubmodule/buyform" for the class name "com.mycompany.myapp.mymodule.mysubmodule.BuyForm".

Yani, bir örnek fasulye tanım

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> 
    <property name="basePackage" value="com.company.project"/> 
</bean> 
<context:component-scan base-package="com.company.project.ws"/> 

olabilir Ve denetleyiciler G uygulanan

package com.company.project.ws; 
@Controller 
public class Service1 { 
    // your controller methods 
} 
+0

Evet, aslında buna baktım. Paket isimlerini dikkate alan URL eşlemesi yapmanın mümkün olup olmadığını söyleyebilir misiniz?Tam nitelikli sınıf adıdır Örneğin "com.ws.Service1" o zaman böyle devam "/ ws/Hizmet1" ve URL eşleme ki? – Shreerang

+0

Evet, bu mümkün. Bu referansta açıklanmamaktadır, ancak JavaDoc gerekli işaretleyicilere sahiptir. Bunu nasıl başaracağınızı yansıtmak için cevabı güncelledim. Ayrıca size yolunu önüne istiyorsanız, ControllerClassNameHandlerMapping için pathPrefix özelliği bakmak isteyebilirsiniz. – ptomli

+0

Bu harika görünüyor, ben denedim ama aşağıdaki hata alıyorum: javax.servlet.ServletException: İşleyici için bağdaştırıcı yok [[email protected]]: İşleyiciniz Denetleyici gibi desteklenen bir arabirim uyguluyor mu ? Fasulye tanımlanmış olsa da Herhangi bir öneriniz var mı? – Shreerang

0

(çok temel ve basit) başka bir yaklaşım gibi görünebilir diyor Birden çok Dispatcher sunucu uygulamasını tanımlamak ve ardından her bir sunucu için farklı URL'leri eşlemek. Servletler, kök Bahar içeriğini paylaşır ve buna ek olarak, kendi fasulye tanımlarına sahiptir. Daha fazla bilgi için bu Java doc.

<servlet> 
    <servlet-name>flex</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<!-- Mappings for BlazeDS requests --> 
<servlet-mapping> 
    <servlet-name>flex</servlet-name> 
    <url-pattern>/spring/messagebroker/*</url-pattern> 
</servlet-mapping> 

<!-- Second dispatcher servlet for Web Services API --> 
<servlet> 
    <servlet-name>wsapi</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>wsapi</servlet-name> 
    <url-pattern>/spring/ws/*</url-pattern> 
</servlet-mapping> 

Temelde, olduğu gibi mevcut memuru Servlet'dir bıraktı ve sadece farklı bir URL haritalama ile DİNLENME kontrolörleri için yeni bir sunucu uygulamasını ekledi: gibi

Yani benim web.xml görünüyor. Bu yüzden, bu servletlerin URL'sini ayrı ayrı kontrol edebilirim. Bundan sonra, her bir Denetleyicinin URL önekini koymaya gerek yok.

İlgili konular