2016-10-04 13 views
6

मैं निम्नलिखित है GET बाकी विधि:OffsetDateTime उपज GET पद्धति में "प्रकार सार्वजनिक javax.ws.rs.core.response की एक पैरामीटर के लिए नहीं मिले इंजेक्शन स्रोत"

import java.time.OffsetDateTime; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.DELETE; 
import javax.ws.rs.GET; 
import javax.ws.rs.HeaderParam; 
import javax.ws.rs.POST; 
import javax.ws.rs.PUT; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.Response; 

import io.swagger.annotations.Api; 
import io.swagger.annotations.ApiOperation; 
import io.swagger.annotations.ApiResponse; 
import io.swagger.annotations.ApiResponses; 
import com.product.rest.api.TransactionsApi; 
import com.product.rest.model.Transaction; 

@Path("/transactions") 

@Api(description = "the transactions API") 
@Consumes({ "application/json" }) 
@Produces({ "application/json" }) 
public class TransactionsApiImpl extends TransactionsApi { 

    @GET 

    @Consumes({ "application/json" }) 
    @Produces({ "application/json" }) 
    @ApiOperation(value = "", notes = "Get all transactions", response =  Transaction.class, responseContainer = "List", tags = {}) 
    @ApiResponses(
     value = { @ApiResponse(code = 200, message = "OK", response =  Transaction.class, responseContainer = "List"), 
      @ApiResponse(code = 400, message = "Bad Request", response =  Transaction.class, responseContainer = "List"), 
      @ApiResponse(code = 404, message = "Not Found", response =  Transaction.class, responseContainer = "List"), 
      @ApiResponse(code = 500, message = "Internal Server Error",  response = Transaction.class, responseContainer = "List") }) 
    @Override 
    public Response transactionsGet(
     @HeaderParam("tok") String tok, 
     @QueryParam("param1") Integer param1, 
     @QueryParam("param2") String param2, 
     @QueryParam("param3") OffsetDateTime param3, 
     @QueryParam("param4") OffsetDateTime param4, 
     @QueryParam("param5") Integer param5, 
     @QueryParam("param6") Integer param6, 
     @QueryParam("param7") String param7) { 
     return Response.ok().entity("Success!").build(); 
    } 

TransactionsApi एक उत्पन्न कार्यान्वयन है Transaction मॉडल वर्ग के रूप में, स्वैगर कोडेजन का उपयोग करना। मैं इस वर्ग में कुछ अन्य कार्य है, लेकिन जब भी मैं GET /transactions समारोह uncommented छोड़ देते हैं, मैं निम्न त्रुटि प्राप्त:

WARN [Thread-1] (ContextHandler.java:2175) - unavailable 
org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. 

[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response  
com.product.rest.impl.v1.TransactionsApiImpl.transactionsGet(java.lang.String,java.lang.Integer,java.lang.String,java.time.OffsetDateTime,java.time.OffsetDateTime,java.lang.Integer,java.lang.Integer,java.lang.String) at index 3.; source='ResourceMethod{httpMethod=GET, consumedTypes=[application/json], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.product.rest.impl.v1.TransactionsApiImpl, handlerConstructors=[[email protected]]}, definitionMethod=public javax.ws.rs.core.Response 

अन्य सभी इसी तरह के सवाल मैं पाया है MultiPart Data और फ़ाइल अपलोड के साथ करना था, जबकि मैं कर रहा हूँ एक सरल GET अनुरोध करना। javax.ws.rs.code.Response कक्षा का उपयोग करने वाले अन्य फ़ंक्शंस में यह समस्या नहीं है और सर्वर सामान्य रूप से प्रारंभ होता है।

मैंने देखा है कि समस्या तब होती है जब OffsetDateTime कक्षा पैरामीटर में होती है (यानी param3 और param4), लेकिन मैं यह पता लगाने में असमर्थ हूं कि क्यों। इसके अलावा, OffsetDateTime को स्वैगर कोडेजन द्वारा चुना गया था और मैं इसे बदलने के लिए अनिच्छुक हूं कि जब भी मैं अपने स्रोतों को पुन: उत्पन्न करता हूं तो मुझे हर व्युत्पन्न फ़ाइल को कैसे बदलना होगा।

क्या किसी को आरईएसटी सेवाओं और OffsetDateTime के साथ पहले यह समस्या थी?

उत्तर

7

All other similar questions I have found had to do with MultiPart Data and file uploading

यह संबंधित है। त्रुटि एक सामान्य त्रुटि है जब आप जर्सी संसाधन मॉडल को मान्य नहीं कर सकते हैं। संसाधन मॉडल का हिस्सा विधि पैरामीटर है। जर्सी के पास यह जानने के लिए एक प्रणाली है कि कौन से पैरामीटर इसे संसाधित करने में सक्षम होंगे और कौन सा नहीं होगा। आपके मामले में, यह नहीं जानता कि OffsetDateTime को कैसे संसाधित करें।

वहाँ

नियम है कि आप @QueryParam रों के रूप में गैर बुनियादी प्रकार उपयोग करने में सक्षम करने के क्रम में पालन करने की आवश्यकता के आ सेट:

  1. बनें एक आदिम प्रकार
  2. एक निर्माता है कि एक एकल स्ट्रिंग तर्क स्वीकार करता है
  3. एक स्थिर विधि valueOf या fromString है कि एक एकल स्ट्रिंग तर्क स्वीकार करता है नामित (देखें उदाहरण के लिए, Integer.valueOf(String))
  4. ParamConverterProvider JAX-रुपये का एक पंजीकृत कार्यान्वयन किया है विस्तार एसपीआई जो ParamConverter उदाहरण देता है जो प्रकार के लिए "स्ट्रिंग से" रूपांतरण में सक्षम है।
  5. List<T>, Set<T> या SortedSet<T>, जहां T ऊपर 2, 3 या 4 संतुष्ट करता है। परिणामी संग्रह केवल पढ़ने के लिए है।

तो OffsetDateTime के इस मामले में, सूची नीचे जा रहा है; यह एक आदिम नहीं है; इसमें स्ट्रिंग कन्स्ट्रक्टर नहीं है; इसमें स्थिर valueOf या fromString

इसलिए हम मूल रूप से शेष विकल्प ParamConverter/ParamConverterProvider को कार्यान्वित करना है। बुनियादी सेट अप लगता है कि

@Provider 
public class OffsetDateTimeProvider implements ParamConverterProvider { 

    @Override 
    public <T> ParamConverter<T> getConverter(Class<T> clazz, Type type, Annotation[] annotations) { 
     if (clazz.getName().equals(OffsetDateTime.class.getName())) { 

      return new ParamConverter<T>() { 

       @SuppressWarnings("unchecked") 
       @Override 
       public T fromString(String value) { 
        OffsetDateTime time = ... 
        return (T) time; 
       } 

       @Override 
       public String toString(T time) { 
        return ...; 
       } 
      }; 
     } 
     return null; 
    } 
} 

असल में, जर्सी आप क्वेरी पैरामीटर की स्ट्रिंग मान पारित करेंगे, और यह बना सकते हैं और इसे वापस करने के लिए करने के लिए अपने काम है।

फिर आवेदन के साथ OffsetDateTimeProvider पंजीकृत करें। यदि आप पैकेज स्कैनिंग का उपयोग कर रहे हैं, तो इसे @Provider एनोटेशन से स्वचालित रूप से लिया जाना चाहिए और पंजीकृत होना चाहिए।

मैं स्वैगर का उपयोग नहीं करता, इसलिए मुझे नहीं पता कि वे पहले से ही ऐसा कुछ प्रदान कर चुके हैं, लेकिन यह अजीब लगता है कि वे इसे आपके लिए उत्पन्न करेंगे, और इसे काम करने का कोई तरीका नहीं है। मुझे पता है कि जर्सी 3 में बॉक्स 8 का समर्थन बॉक्स होगा, लेकिन कौन जानता है कि बिल्ली कब जारी किया जाएगा।

+0

यह काफी जानकारीपूर्ण था। आपका बहुत बहुत धन्यवाद! – user991710

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