web-dev-qa-db-fra.com

Téléchargement de fichier à l'aide de Jersey sur le service RESTful et la configuration des ressources n'est pas modifiable?

@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)

J'ai implémenté un service de test comme celui-ci sous le UploadFileService:

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

et j'ai eu cette exception pour me connecter:

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)

Environnement

  • Netbeans7.3.1
  • Glassfish 4.0
  • Jersey 2 avec Glassfish 4.0
33
Sami

Afin d'utiliser plusieurs parties dans votre application Jersey, vous devez vous inscrire MultiPartFeature dans votre application, à savoir:

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

Pour plus d'informations, consultez la section Multipart dans le Guide de l'utilisateur de Jersey.

Pour le deuxième problème auquel vous êtes confronté, essayez de redémarrer le serveur GlassFish, je ne sais pas comment NetBeans recharge l'application Jersey après un changement (si cela n'aide pas, veuillez publier votre ApplicationConfig).

45
Michal Gajdos

J'ai eu le même problème et je voulais éviter de créer une classe d'application personnalisée. Ce n'est pas bien documenté, mais si vous voulez ajouter une fonctionnalité en plusieurs parties, tout ce que vous avez à faire est de l'ajouter à votre configuration de servlet de jersey web.xml:

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

J'ai également ajouté un filtre de journalisation.

32
Ed Pike

Si vous utilisez le serveur jetty et le servlet jersey, vous pouvez résoudre ce problème en ajoutant le code suivant dans votre classe principale où vous avez démarré le serveur jetty,

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");
2
Loyola A

J'utilise Jersey 1.9.1. org.glassfish ...... fonctionne bien avec Jersey 2. Pour Jersey 1, vous feriez mieux d'utiliser les cours com.Sun ...

0
Yergalem

Juste une clarification mineure

Utilisation

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

Ne pas

com.Sun.jersey.*

A fonctionné pour moi uniquement lorsqu'il est utilisé org.glassfish.jersey.media.multipart.*

Dans ApplicationConfig, enregistrez simplement MultiPartFeature en tant que

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
Rauan Argyn