2013-02-21 50 views
8

पर शामिल करें हम स्वचालित WADL पीढ़ी की अपनी शानदार सुविधा का उपयोग कर रीस्टफुल एपीआई कार्यान्वयन के लिए जर्सी का उपयोग कर रहे हैं।@PathParam के संभावित मूल्यों को WADL

बस एक उदाहरण के रूप हमारे पास विधि

@GET 
@Path("/{id}/{attribute}") 
@Produces(MediaType.APPLICATION_JSON) 
public Object getAttributeByID(@PathParam("id") long id, @PathParam("attribute") String attribute) { 
.... 
} 

यह WADL में निम्नलिखित टुकड़ा उत्पन्न करता है:

<param type="xs:string" style="template" name="attribute:.*"/> 

गुण name, type, size हो सकता है और हम न केवल मूल्य मान्य करने के लिए चाहते हैं रनटाइम पर, लेकिन इसे जेनरेटेड वैडल में भी दिखाएं this document के अनुसार ऐसी सुविधा <param> के अंदर कई टैग <option> उत्पन्न करके समर्थित की जानी चाहिए, i मैं। निम्नलिखित की तरह कुछ उम्मीद कर रहा हूं:

<param type="aws:Attributes" style="template" name="attribute"> 
    <option value="name"/> 
    <option value="type"/> 
    <option value="size"/> 
</param> 

मेरी समस्या यह जर्सी के साथ सक्षम करने के लिए है।

@Path("/{id}/{attribute}") 
@Produces(MediaType.APPLICATION_JSON) 
public Object getAttributeByID(@PathParam("id") long id, @PathParam("attribute") Attribute attribute) { 
.... 
} 

जहां

public enum Attribute { 
    name, type, size 
} 

: अगर प्रासंगिक दस्तावेज खोजने में असफल रहा और मान लिया है कि शायद अगर मैं String से enum लिए पैरामीटर का प्रकार बदलने के लिए इस सुविधा को स्वचालित रूप से काम करेंगे, तो मैं करने के लिए विधि हस्ताक्षर बदल लेकिन जर्सी अभी भी विकल्पों के बिना <param> टैग उत्पन्न करता है और पैरामीटर का प्रकार अभी भी xs:string है।

मैंने इसे जर्सी के कोड में खोजने की कोशिश की और प्रासंगिक जेएक्सबी एनोटेशन के साथ com.sun.research.ws.wadl.Option कक्षा मिली, इसलिए यह प्रासंगिक प्रतीत होता है, लेकिन मुझे नहीं पता कि यह कैसे काम कर रहा है। मुझे लगता है कि समस्या WadlGeneratorConfig में है।

public class OurWADLGenerator extends WadlGeneratorConfig { 
    @Override 
    public List<WadlGeneratorDescription> configure() { 
     return generator(WadlGeneratorApplicationDoc.class) 
       .prop("applicationDocsStream", "application-doc.xml") 
      .generator(WadlGeneratorResourceDocSupport.class) 
       .prop("resourceDocStream", "resourcedoc.xml").descriptions(); 
    } 
} 

क्या मैं यहाँ याद आ रही है:

यहाँ हमारे web.xml

<filter> 
<filter-name>REST-API</filter-name> 
<filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class> 
    ................ 
<init-param> 
    <param-name>com.sun.jersey.config.property.WadlGeneratorConfig</param-name> 
    <param-value>com.mycompany.resource.OurWADLGenerator</param-value> 
</init-param> 
<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>com.mycompany</param-value> 
</init-param> 
</filter> 

जहां OurWADLGenerator कोड है में जर्सी परिभाषा के प्रासंगिक हिस्सा है? अग्रिम धन्यवाद।

+0

'सार्वजनिक enum Attribure' 'सार्वजनिक enum विशेषता 'होना चाहिए ... क्या यह आपके कोड या सिर्फ एक टाइपो से कॉपी किया गया था? –

+0

@ मार्टिनजाकुबिक, यकीन है कि यह टाइपो था। धन्यवाद। मैंने अभी पोस्ट संपादित किया है और इस गलती को ठीक कर दिया है। – AlexR

उत्तर

2

कुछ जांच के बाद मुझे जर्सी जहां विकल्प सूची से भर जाता है में किसी भी कोड नहीं मिला। (शायद कुछ है जो अभी तक समर्थित नहीं)

तो आप अपने खुद के WadlGenerator को लागू करने और यह डालने कर सकते हैं जनरेटर श्रृंखला।

यहां नमूने OptionsWadlGenerator प्रकार के पैरामीटर के लिए <option> तत्वों को जोड़ने है Enum

package com.mycompany; 

import com.sun.jersey.api.model.AbstractMethod; 
import com.sun.jersey.api.model.AbstractResource; 
import com.sun.jersey.api.model.AbstractResourceMethod; 
import com.sun.jersey.api.model.Parameter; 
import com.sun.jersey.server.wadl.WadlGenerator; 
import com.sun.research.ws.wadl.Application; 
import com.sun.research.ws.wadl.Method; 
import com.sun.research.ws.wadl.ObjectFactory; 
import com.sun.research.ws.wadl.Option; 
import com.sun.research.ws.wadl.Param; 
import com.sun.research.ws.wadl.RepresentationType; 
import com.sun.research.ws.wadl.Request; 
import com.sun.research.ws.wadl.Resource; 
import com.sun.research.ws.wadl.Resources; 
import com.sun.research.ws.wadl.Response; 

import javax.ws.rs.core.MediaType; 

public class OptionsWadlGenerator implements WadlGenerator { 

    private WadlGenerator _delegate; 

    private ObjectFactory objectFactory = new ObjectFactory(); 

    @Override 
    public Param createParam(AbstractResource r, AbstractMethod m, Parameter p) { 
     Param param = _delegate.createParam(r, m, p); 
     if(((Parameter)p).getParameterClass().isEnum()){ 
      Object[] values = p.getParameterClass().getEnumConstants(); 
      for(Object enumItem:values){ 
       Option option = objectFactory.createOption(); 
       option.setValue(((Enum)enumItem).name()); 
       param.getOption().add(option); 
      } 
     } 
     return param; 
    } 

    @Override 
    public void setWadlGeneratorDelegate(WadlGenerator delegate) { 
     this._delegate = delegate; 
    } 

    @Override 
    public Application createApplication() { 
     return _delegate.createApplication(); 
    } 

    ... all other methods also simply call the _delegate equivalent method  
} 

और निश्चित रूप से, अपने श्रृंखला में सम्मिलित करने के लिए, ऐसा ही कुछ कार्य करें:

public class OurWADLGenerator extends WadlGeneratorConfig { 
    @Override 
    public List<WadlGeneratorDescription> configure() { 
     return generator(WadlGeneratorApplicationDoc.class) 
       .prop("applicationDocsStream", "application-doc.xml") 
      .generator(WadlGeneratorResourceDocSupport.class) 
       .prop("resourceDocStream", "resourcedoc.xml") 
      .generator(OptionsWadlGenerator.class).descriptions(); 
    } 
} 
3

com.sun.research.ws.wadl.Param.getOption() के उपयोग के लिए एक त्वरित खोज (परिणाम here देखें) दिखाता है कि यह वास्तव में लाइब्रेरी से कभी नहीं बुलाया जाता है। मुझे लगता है कि यह केवल वहां है क्योंकि इन वर्गों को xjc द्वारा wadl.xsd से उत्पन्न किया जाता है। ऐसा लगता है कि जर्सी मूल रूप से wadl फ़ाइलों में जानकारी के इस टुकड़े को अनदेखा करता है, और इसी तरह इसे उत्पन्न होने वाली वैडल फ़ाइलों में शामिल करने की परवाह नहीं करता है।

कुछ साल पहले हमने wadl उत्पन्न करने के लिए अपना कोड लिखना समाप्त कर दिया, क्योंकि उपलब्ध टूलिंग बहुत खराब थी। तब से यह बदल सकता है, लेकिन उपरोक्त मुद्दे से पता चलता है कि वैडल के लिए उचित समर्थन अभी भी काफी नहीं है। :(

+0

आपके प्रयास के लिए धन्यवाद। मुझे इस कार्यक्षमता का कोई संदर्भ भी नहीं मिला, लेकिन माना जाता है कि यह शायद प्रतिबिंब द्वारा किसी भी तरह से बेदखल रूप से लागू किया गया है। – AlexR

+0

'वाडलजेनरेटर' के केवल कुछ कार्यान्वयनकर्ता हैं, और 'createParam() 'उनमें से किसी में भी परिष्कृत नहीं है, इसलिए मैंने अभी निष्कर्ष निकाला है कि अगर उसके गेटटर का कोई संदर्भ नहीं है तो विकल्प सूची को अनदेखा किया जाता है। – zagyi