Uploading file using Jersey over RESTfull service and The resource configuration is not modifiable?

49,833

Solution 1

In order to use multipart in your Jersey application you need to register MultiPartFeature in your application, i.e.:

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;
    }
}

For more information see Multipart section in the Jersey Users Guide.

For the second issue you're facing try to restart the GlassFish server, I am not sure how NetBeans are reloading the Jersey app after a change (if this doesn't help, please post your ApplicationConfig).

Solution 2

I had the same problem and wanted to avoid creating a custom application class. It is not well documented, but if you want to add Multipart functionality, all you have to do is add this to your web.xml jersey servlet 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>

I also added a loggingfilter.

Solution 3

If you are using jetty server and jersey servlet, then you can solve this problem by adding the following code in your main class where you have started the jetty server,

ServletHolder jerseyServlet = context.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");
Share:
49,833
Sami
Author by

Sami

Trying to code here and there with Angular, React, Java, Vaadin...

Updated on June 02, 2020

Comments

  • Sami
    Sami almost 4 years
    @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=[org.glassfish.jersey.server.model.HandlerConstructor@47bee27a]}, 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)
    

    I implemented test service like this under the UploadFileService:

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

    and I got this exception to log:

    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)
    

    Environment

    • Netbeans7.3.1
    • Glassfish 4.0
    • Jersey 2 with Glassfish 4.0