2013-08-15 6 views
33
@Path("file.upload") 
public class UploadFileService { 
@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(
     @FormDataParam("file") InputStream uploadedInputStream, 
     @FormDataParam("file") FormDataContentDisposition fileDetail) { 

    System.out.println("-----------------UploadFileService------------------1."); 
    // Should we use a disk or DB? Decided to use DISK 
    // Path should be read from properties-files 
    String uploadedFileLocation = "//uploaded/" + fileDetail.getFileName(); 

    // save it 
    writeToFile(uploadedInputStream, uploadedFileLocation); 

    String output = "File uploaded to : " + uploadedFileLocation; 
    // All went OK 
    return Response.status(200).entity(output).build(); 

} 
WARNING: No injection source found for a parameter of type public javax.ws.rs.core.Response com.insame.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0. 

SEVERE: WebModule[/insame]StandardWrapper.Throwable 
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.insame.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=MethodHandler{handlerClass=class com.insame.service.UploadFileService, handlerConstructors=[[email protected]]}, handlingMethod=public javax.ws.rs.core.Response com.insame.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file, defaultValue=null], Parameter [type=class com.sun.jersey.core.header.FormDataContentDisposition, source=file, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}'] 
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:410) 
    at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:157) 
    at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:280) 
    at org.glassfish.jersey.internal.Errors$2.call(Errors.java:289) 
    at org.glassfish.jersey.internal.Errors$2.call(Errors.java:286) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:286) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:277) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:262) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167) 

मैं UploadFileService के तहत इस तरह परीक्षण सेवा कार्यान्वित:रीस्टफुल सेवा पर जर्सी का उपयोग कर फ़ाइल अपलोड करना और संसाधन कॉन्फ़िगरेशन संशोधित नहीं है?

@GET 
@Path("count") 
@Produces("text/plain") 
public String countREST() { 
    return "1 one 1"; 
} 

और मैं लॉग इन करने के इस अपवाद है:

FINE: [Web-Security] hasResource perm: ("javax.security.jacc.WebResourcePermission" 

"/webresources/file.upload/count" "GET") 
SEVERE: WebModule[/insame]StandardWrapper.Throwable 
java.lang.IllegalStateException: The resource configuration is not modifiable in this context. 
    at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257) 
WARNING: StandardWrapperValve[com.insame.service.ApplicationConfig]: Allocate exception for servlet com.insame.service.ApplicationConfig 
java.lang.IllegalStateException: The resource configuration is not modifiable in this context. 
    at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257) 
    at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:205) 
    at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:435) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:261) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349) 

पर्यावरण

  • Netbeans7.3.1
  • Glassfish 4.0
  • जर्सी 2 Glassfish 4,0
+0

'संसाधन कॉनफिग' समाधान के लिए http://stackoverflow.com/a/43926819/548473 – GKislin

उत्तर

45

साथ के लिए अपने जर्सी आवेदन में बहुखण्डीय उपयोग करने के लिए आप अपने आवेदन में MultiPartFeature रजिस्टर करने की आवश्यकता यानी में:

public class ApplicationConfig extends Application { 

    public Set<Class<?>> getClasses() { 
     final Set<Class<?>> resources = new HashSet<Class<?>>(); 

     // Add your resources. 
     resources.add(UploadFileService.class); 

     // Add additional features such as support for Multipart. 
     resources.add(MultiPartFeature.class); 

     return resources; 
    } 
} 

अधिक जानकारी के लिए जर्सी उपयोगकर्ता मार्गदर्शिका में Multipart अनुभाग देखें।

दूसरी समस्या के लिए आप ग्लासफ़िश सर्वर को पुनरारंभ करने का प्रयास कर रहे हैं, मुझे यकीन नहीं है कि परिवर्तन के बाद नेटबीन जर्सी ऐप को फिर से लोड कर रहे हैं (यदि यह मदद नहीं करता है, तो कृपया अपना ApplicationConfig पोस्ट करें)।

+0

बहुत बहुत धन्यवाद! त्रुटि संदेश बदल गया और मुझे अपने pom.xml में एक त्रुटि मिली। मैं अपने pom.xml में पुराने मल्टीपार्ट संस्करण का उपयोग कर रहा था। WELD-001408 इंजेक्शन प्वाइंट पर क्वालीफायर [@ डीफॉल्ट] के साथ प्रकार [प्रदाता] के लिए असंतुष्ट निर्भरता [[बैकएडएनोटेटेड पैरामीटर] पैरामीटर 1 [समर्थित एंजोटेटेड कॉन्स्ट्रक्टर] @ इंजेक्ट सार्वजनिक org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide (@Context प्रदाता, प्रदाता )] – Sami

+0

यह आपके '.war' में जर्सी 2.x बिट्स के कुछ होने से संबंधित हो सकता है (जबकि वे एक ही समय में जीएफ क्लासपाथ पर हैं)। क्या आप अपने pom.xml में प्रदान किए गए 'जर्सी-मीडिया-मल्टीपार्ट' आर्टिफैक्ट को चिह्नित कर सकते हैं? यह पहले ही जीएफ 4.0 का हिस्सा है। –

+0

वह था !! अब यह काम कर रहा है! org.glassfish.jersey.media जर्सी-मीडिया-बहुखण्डीय 2,2 Sami

31

मुझे एक ही समस्या थी और एक कस्टम एप्लिकेशन वर्ग बनाने से बचना चाहता था। यह अच्छी तरह से प्रलेखित नहीं है, लेकिन आप मल्टीपार्ट कार्यक्षमता जोड़ने के लिए चाहते हैं, तो तुम सब करने की है, तो अपने web.xml जर्सी सर्वलेट config में जोड़ना है:

<init-param> 
    <param-name>jersey.config.server.provider.classnames</param-name> 
    <param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value> 
</init-param> 

मैं भी एक loggingfilter गयी।

+0

आपका समाधान सबसे अच्छा है! –

+1

मैं इसे या तो काम करने के लिए नहीं मिल सकता। क्या इसे कहीं विशिष्ट क्रमवार होने की आवश्यकता है? क्या आपके पास किसी भी मौके से आपके पूरे पोम का एक झुकाव है? – streetlight

+0

यह सबसे आसान तरीका है और एक आकर्षण की तरह काम करता है! अत्यधिक सिफारिशित! – Ozil

0

बस नाबालिग स्पष्टीकरण

उपयोग

import org.glassfish.jersey.media.multipart.MultiPartFeature 
import org.glassfish.jersey.media.multipart.FormDataContentDisposition; 
import org.glassfish.jersey.media.multipart.FormDataParam; 

नहीं

com.sun.jersey.* 

मेरे लिए काम केवल जब org.glassfish.jersey.media.multipart.*

इस्तेमाल किया था ApplicationConfig में सिर्फ

रूप MultiPartFeature रजिस्टर
import org.glassfish.jersey.media.multipart.MultiPartFeature; 

@javax.ws.rs.ApplicationPath("webresources") 
public class ApplicationConfig extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<>(); 
     resources.add(UploadFileService.class); 
     resources.add(MultiPartFeature.class); 
     return resources; 
    } 
} 
+0

ह्लीओ दोस्तों, मैं वाइल्डफ्लाई सर्वर का उपयोग कर रहा हूं, क्या मैं आयात org.glassfish.jersey.media.multipart आयात कर सकता हूं। * मेरे एप्लिकेशन कॉन्फिग में, यदि हाँ आप बता सकते हैं कि निर्भरता क्या है जो मुझे अपने pom.xml में जोड़ना चाहिए, क्योंकि मुझे इस प्रोजेक्ट में यह त्रुटि मिल रही है: javax.ws.rs.NotSupportedException: संदेश बॉडी रीडर को प्रकार के लिए नहीं मिला: class com.sun.jersey.core.header.FormDataContent सामग्री प्रकार का डिस्पोजिशन: मल्टीपार्ट/फॉर्म-डेटा ;, आपको थक गया उन्नत में। – James

2

आप घाट सर्वर और जर्सी सर्वलेट उपयोग कर रहे हैं, तो आप अपने मुख्य वर्ग में निम्न कोड जहां घाट सर्वर शुरू कर दिया है,

ServletHolder jerseyServlet = संदर्भ जोड़कर इस समस्या को हल कर सकते हैं। addServlet ( org.glassfish.jersey.servlet.ServletContainer.class, "/ *"); jerseyServlet।setInitOrder (0);

 // Tells the Jersey Servlet which REST service/classes to load. 
     jerseyServlet 
       .setInitParameter(
         "jersey.config.server.provider.classnames", 
         <Your entry point class's canonical name> 
           + ";org.glassfish.jersey.media.multipart.MultiPartFeature"); 
-1

आप @FormDataParam ("फ़ाइल") का उपयोग कर सकते FormDataMultiPart के बराबर आप इसे एनोटेशन का उपयोग कर चाहते हैं।

नमूना कोड निकालने नीचे दिए गए के रूप में प्रयुक्त:

public Response uploadFile(**@FormDataParam("file")** InputStream fileInputStream, 
      @FormDataParam("file") FormDataContentDisposition contentDispositionHeader) { 
0

मैं जर्सी 1.9.1 का उपयोग कर रहा हूँ। org.glassfish ...... जर्सी के साथ अच्छी तरह से काम करता है 2. जर्सी 1 के लिए आप com.sun ... कक्षाओं का बेहतर उपयोग करते हैं।

+1

आपके उत्तर के लिए दो पद जोड़ने के बजाय, मैं सुझाव दूंगा कि आप प्रश्न का उत्तर देने के अपने पहले प्रयास की अपनी पोस्ट संपादित करें (यानी [यह पोस्ट] (http://stackoverflow.com/a/42960464/3519000))। धन्यवाद। – lrnzcig

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