2015-01-23 7 views
6

मैं इस पैटर्न के साथ मेरी वेब सेवा कॉल करना चाहते हैं:जर्सी: अल्पविरामों से @PathParam सूची में <MyObject>

/resource/1,2,3 

और मेरी क्लास में मैं वस्तु की एक सूची के लिए अपने मानकों को बाध्य करने के लिए चाहते हैं

@Path("/resource") 
public class AppWS { 

    @GET 
    @Path("/{params}") 
    public Response get(@PathParam("params") List<MyObject> params) { 
     return Response.status(200).entity("output").build(); 
    } 
} 

एक साधारण वस्तु के साथ:

public class MyObject { 
    Integer value; 
    public MyObject(Integer value) { 
     this.value = value; 
    } 
} 

nb: यह संभव मैं एक MyObjectList क बनाने के लिए नहीं करना चाहते हैं ich सूची बढ़ाता है (और एक कन्स्ट्रक्टर है जो मेरी स्ट्रिंग को विभाजित करता है)

मैं कैसे आगे बढ़ सकता हूं?

+0

आपका लिंक टूटा हुआ है। क्या आप बस पैटर्न का नाम कह सकते हैं या इसके बजाय समझा सकते हैं? प्रतिक्रिया के लिए – gla3dr

+0

हाय gla3dr, thx। यह एक असली लिंक नहीं है, यह सिर्फ यूरी का एक उदाहरण है जो संसाधन तक पहुंच सकता है। असल में, मैं पथ में बहु मानों के लिए अल्पविरामों का उपयोग करना चाहता हूं (मैं अपनी पोस्ट संपादित करता हूं) – Guillaume

+0

ओह मैं देखता हूं। मैंने तुम्हारा क्या मतलब गलत व्याख्या किया, मेरा बुरा! जिस तरह से आपके पास अब यह स्पष्ट है। – gla3dr

उत्तर

4

मुझे यकीन नहीं है कि 1,2,3 का तरीका है।

यदि आप जोर देते हैं,

private Response get(List<MyObject> params) { 
} 

@GET 
@Path("/{params}") 
public Response get(@PathParam("params") String params) { 

    return get(Stream.of(params.split(",")) 
     .map(MyObject::new) 
     .collect(Collectors.toList())); 
} 

तुम सच में जोर देते हैं, तो

एनोटेशन,

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD, ElementType.PARAMETER}) 
public @interface MyObjectsParam { 

} 

कनवर्टर,

public class MyObjectsParamDateConverter 
    implements ParamConverter<List<MyObject>> { 

    @Override 
    public List<MyObject> fromString(final String value) { 
     return Stream.of(params.split(",")) 
      .map(MyObject::new) 
      .collect(Collectors.toList()) 
    } 

    @Override 
    public String toString(final List<MyObject> value) { 
     return value.stream() 
      .map(o -> o.getValue()) 
      .map(Object::toString) 
      .collect(Collectors.joining(",")); 
    } 
} 

प्रदाता,

+०१२३५१६४१०
@Provider 
public class MyObjectsParamConverterProvider 
    extends ParamConverterProvider { 

    @Override 
    @SuppressWarnings("unchecked") 
    default ParamConverter getConverter(final Class<S> rawType, 
             final Type genericType, 
             final Annotation[] annotations) { 
     for (final Annotation annotation : annotations) { 
      if (MyObjectsParam.class.isInstance(annotation)) { 
       return new MyObjectsParamDateConverter(); 
      } 
     } 

     return null; 
    } 
} 

अब आप इसका उपयोग कर सकते हैं।

@GET 
@Path("/{params}") // still '1,2,3' 
public Response get(
    @PathParam("params") 
    @MyObjectsParam // IN ACTION!!! 
    List<MyObject> params) { 

} 
संबंधित मुद्दे