2016-03-23 10 views
2

Jersey (2.22.2) 'ye yeni oldum, lütfen bana katılın. Kullanıcı verilerini saklamak, kaldırmak ve almak için bir LDAP sunucusuyla arabirim oluşturan bir REST hizmeti oluşturuyorum. Servis şifreleme/şifre çözme işlemini gerçekleştirerek bir güvenlik aracı görevi görür.Java Jersey 2'de singleton'u başlat JAX-RS

REST hizmetlerinden yararlanılabilmesi için yapılması gereken bir miktar başlatma işlemi vardır ve bu başlatmayı yalnızca bir kez gerçekleştirmek istiyorum (uygulama sunucuya dağıtıldığında). Yani bu hizmet bir singleton olarak çalıştırılacaktı.

Bunu yapmanın en iyi yolu hakkında bana bazı işaretçiler verebilirse memnun olur musunuz? Teşekkürler!

cevap

1

Kullanıcı Yay Çerçevesi.

https://projects.spring.io/spring-framework/

https://jersey.java.net/documentation/latest/spring.html

Orada burada tam çalışma örneği:

https://github.com/jersey/jersey/tree/2.22.2/examples/helloworld-spring-webapp

Sen temelde forma projeye bu bağımlılığı eklemek ve otomatik olarak bahar ekleriz

:

 <dependency> 
      <groupId>org.glassfish.jersey.ext</groupId> 
      <artifactId>jersey-spring3</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
applicationContext.xml ve src/main/resources adlı bir dosyada

ve sonra, tanımladığınız Bahar Fasulye:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd"> 

    <bean id="mySingletonService" class="com.test.MyService"/> 
<beans/> 

Son Fakat en az değil, gerçek kaynak Eğer @Autowire ek açıklamayı kullanarak bu tekil hizmeti enjekte :

@Path("/resource") 
@Component 
public class MyResource { 

    @Autowired 
    private MyService myService; 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getHello() { 
     return myService.sayHello(); 
    } 
} 

@SingletonResource kullanılması ve kaynak dahilinde devlet başlatılıyor IMO çok çok kötü bir fikirdir. Endişelerin ayrılması önemlidir ve bir REST Kaynakta durumu korumak oldukça basittir. Arayüzünüzle (REST) ​​ilgilenen kodu ve iş mantığınızı bir LDAPResource ve bir LDAPService diyelim oluşturarak ayırın. Spring'in burada oynadığı bölüm, sadece kendini yaratmak zorunda kalacağınız kablolar.

+0

Bu iyi bir cevap değil. Sadece "Bahar Çerçevesi Kullan" yazıyor ve kullanıcının sorusunu nasıl ele aldığını açıklamadan bazı belgelere bağlanıyor. – DavidS

+0

@DavidS Bahar bunun için daha iyi bir çerçeve olabilir mi? Jersey’i hurdaya çevirmek anlamına gelse bile, bunun için en uygun olanın peşindeyim. – Wes

+0

@Wes, Spring, birçok kullanım örneğini destekleyen bir çerçevedir. Jersey, REST servislerini yapmak için küçük bir kütüphanedir. Geleceğini tahmin edemem, ama sadece Jersey ile başlayacağım. Cevabım, Bahar'ın bu noktada gereksiz bir bağımlılık olacağını gösterdiğini düşünüyorum: Jersey zaten ne yapmak istediğinizi destekliyor. – DavidS

5

Jersey 2.22.2, kendi kaynaklarının yaşam döngüsünü değiştiren yerleşik bir desteğe sahiptir. @Singleton ek açıklamasını kullanabilirsiniz. Resmi belgelerde JAX-RS Application, Resources and Sub-Resources: Life-cycle of Root Resource Classes numaralı telefondan okuyun. Basitçe başlatma kodunuzu kaynağın varsayılan yapıcısına koyun.

  • Kapsam: Singleton
  • Ek Açıklama: @Singleton
  • Ek Açıklama tam sınıf adı: jax-rs uygulama başına yalnızca bir örneği var Bu kapsamda javax.inject.Singleton

. Singleton kaynağı, @Singleton ile ek açıklamalı olabilir ve sınıfı, uygulama örneğinde kullanılarak kaydedilebilir. Ayrıca, singleton örneklerini Application içine kaydederek tekli oluşturabilirsiniz.

Örnek: Yukarıdaki örnekte

package com.airhacks; 
import java.util.Date; 
import javax.inject.Singleton; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.Response; 

@Path("/hello") 
@Singleton 
public class HelloWorldService { 

    public HelloWorldService() throws InterruptedException { 
     // Some expensive initialization goes here. 
     Thread.sleep(5000); 
     System.out.println("Initialized at " + new Date()); 
    } 

    @GET 
    public Response getMsg() { 
     String output = "Hello world at " + new Date(); 
     return Response.status(200).entity(output).build(); 
    } 

} 

, ilk istek GlassFish 3 yavaş başlatma nedeniyle beş saniye sürdü, ardından sonraki tüm istekleri hemen servis.

0

Hizmetinizin en kısa sürede başlatılmasını sağlamak için @Singleton yerine @Immediate kullanabilirsiniz. Jersey'in varsayılan bağlamda başlatılmayacağı bir noktada bir sorun vardı, ama bence bu şu ana kadar çözüldü:

+0

Bunun çalıştığını onayladınız mı? Ben googled ve bu [açık bilet] (https://java.net/jira/browse/JERSEY-2291) bulundu. – DavidS

+0

Bana hala açılmış gibi görünüyor ama bu hk2 onu tamir edemez, Jersey seviyesinde sabitlenmelidir. Bunun hakkında Jersey'li adamlarla konuşacağım – jwells131313