2013-07-20 21 views
8

ExceptionMapper uygulamasını uygulayarak tek örnekli bir sınıfım var. Bu, statik bir sınıf değil, yalnızca tek bir örneğin oluşturulduğunu bildiğim bir sınıftır (ben kontrol ettim - yapıcı sadece bir kez çağrılır).JAX-RS (Jersey) ExceptionMapper - @ Statik/singleton sınıfına harici enjeksiyon - işe yarıyor ama neden?

Benim sınıf @Context HttpServletRequest kullanır ve açıkça gözlemleyebilirsiniz benim ExceptionMapper.toResponse() yöntemi denir, @Context 'isteği' parametresi istek ilgilendirmektedir değerine sahip olduğunda istisna nerede atılır. Bu, tasarım tarafından desteklenen bir özelliktir ve "proxy'ler" kullanılarak gerçekleştirilmiştir.

Bunun nasıl uygulandığını merak ediyorum - tek bir örnek aynı anda farklı üye değişken değerlerine sahip olabilir mi?


AG

,

PS teşekkür ederiz:

@Provider 
public class MyExceptionMapper implements ExceptionMapper<Exception> { 

    public MyExceptionMapper() { 
     System.out.println("CTOR!!"); 
    } 

    @Context HttpServletRequest req; 

    public static boolean done = false; 
    public Response toResponse(Exception ex) { 
     if (!done) { 
      done = true; 
      Thread.sleep(10000); 
     } 
     System.out.println(req.getRequestURI()); 
     return null; 
    } 
} 

Benim DİNLENME işleyicisi yöntemi istisna atar (uyku ı "paralel" Aşağıdaki 2 istekleri yürütmek, bu nedenle zaman: Burada test kodu var) ikincisi gelir ve IMHO tek ve okunur 'req' alanını değiştirmek gerekirken yukarıda emin birincisi bitmiş değil yapar:

- http://localhost/app/one 
- http://localhost/app/two 

programım baskılar:

CTOR! 
http://localhost/app/one 
http://localhost/app/two 

cevap

5

aslında bir proxy nesnesi gerçekHttpServletRequest için parçacığı farkında temsilci olmak size enjekte HttpServletRequest nesne içindir gözlemlemek etkiyi elde etmenin en basit yöntemi. Temsilci üzerinde yöntemleri çağırdığınızda, tek yaptıkları doğru doğru nesneyi arar (ör., Iş parçacığı yerel değişkenini kullanarak) ve çağrıyı buna iletir. Bu stratejinin doğru olması göreceli olarak basittir ve bir arayüz olması nedeniyle kesinlikle alan erişimi hakkında endişelenmenize gerek yoktur (ki bu da proxy için biraz daha zorlayıcıdır).

Böyle bir proxy nesnesini oluşturmanın birkaç farklı yolu var. Özellikle, HttpServletRequest arayüzünün doğrudan uygulanmasıyla yapılabilir veya Java general dynamic proxy mechanism aracılığıyla daha genel olarak yapılabilir (herhangi bir arayüz için bir proxy oluşturabilir). Çalışma zamanı kodu oluşturma gibi daha ayrıntılı olasılıklar var, ancak burada gereksizler. OTOH, HttpServletRequest doğrudan uygulandığında hiç şaşırmadım; JAX-RS uygulaması için biraz önemli bir sınıf…

İlgili konular