2016-03-22 32 views
2

Uç noktaların kaynak dosya açıklamasına bağlı olarak oluşturulduğu bir RESTful hizmeti yapıyorum. Kaynaklar, örtülü bir yöntem oluşturucu işleyicisiyle kaydediliyor, ancak örtük işleyiciyi açık bir şekilde değiştirmeye çalıştığımda bir duvara çarpıyorum.Özel jersey Ayırıcı

Aşağıdaki örnekte, dolaylı ItemInflector uygulamasıyla örtülü işleyici Inflector'un yerini aldım. Dize sonucu yürütme sonrasında bekleniyor.

final Resource.Builder resourceBuilder = Resource.builder(); 
resourceBuilder.path("api/myservice/item"); 
final ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod("GET"); 

methodBuilder.produces(MediaType.TEXT_PLAIN_TYPE) 
    .handledBy(new ItemInflector<ContainerRequestContext, String>(String.class)); 

final Resource resource = resourceBuilder.build(); 
registerResources(resource); 

ItenInflector uygulaması: Ben son nokta isabet çalıştığınızda Çalışma zamanında

public class ItemInflector<DATA extends ContainerRequestContext, RESULT> implements Inflector<DATA, RESULT> { 

    private Class<RESULT> type; 

    public ItemInflector(Class<RESULT> type) { 
     this.type = type; 
    } 

    @Override 
    public RESULT apply(DATA data) { 
     return type.cast("Half programmatically generated endpoint"); 
    } 
} 

aşağıdaki hata atılır.

Caused by: java.lang.IllegalArgumentException: Type parameter RESULT not a class or parameterized type whose raw type is a class 

Birisi, Inflector uygulamasında neyi yanlış yaptığımı temizleyebilir mi? RESULT tipi nasıl parametrelendirilir veya tanımlanır?

cevap

1

ItemInflector örneği oluşturma sırasında belirtilen type parametresi (<ContainerRequestContext, String>) çalışma zamanında kaybolur. Nedeni Javas type erasure davranışıdır. Bir alt sınıfta türü belirtmeniz veya burada anonim sınıflar kullanmanız gerekir.

1. seçeneği anonim sınıf (evet, şimdi derleyici tür bilgileri tutar):

methodBuilder.produces(MediaType.TEXT_PLAIN_TYPE) 
    .handledBy(new Inflector<ContainerRequestContext, String>(){ 
     ... 
    }); 

seçenek 2, bir sublcass içinde türünü belirtin:

public class ItemInflector implements Inflector<ContainerRequestContext, String> { 
.... 
} 

İşte tip silme davranışına ilişkin çok ayrıntılı bilgiler: Java generics - type erasure - when and what happens

+0

Güncelleme yapmak ister misiniz? İkinci linkler kırık. – Maxim

+0

zaten bitmiştir :) –