Cargando el archivo usando Jersey sobre el servicio RESTfull y la configuración del recurso no es modificable?


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

Implementé el servicio de prueba como este bajo el UploadFileService:

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

Y tengo esta excepción para registrar:

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)

Medio ambiente

  • Netbeans7. 3. 1
  • Glassfish 4.0
  • Jersey 2 con Glassfish 4.0
Author: ROMANIA_engineer, 0000-00-00

4 answers

Para usar multipart en su aplicación de Jersey, debe registrarse MultiPartFeature en su aplicación, es decir:

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

Para obtener más información, consulte la sección Multipart en la Guía del usuario de Jersey.

Para el segundo problema que enfrenta, intente reiniciar el servidor GlassFish, no estoy seguro de cómo NetBeans está recargando la aplicación Jersey después de un cambio (si esto no ayuda, envíe su ApplicationConfig).

 45
Author: Michal Gajdos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-01 11:59:12

Tuve el mismo problema y quería evitar crear una clase de aplicación personalizada. No está bien documentado, pero si desea agregar funcionalidad Multiparte, todo lo que tiene que hacer es agregar esto a su 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>

También agregué un loggingfilter.

 31
Author: Ed Pike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-14 15:54:22

Si está utilizando jetty server y jersey servlet, entonces puede resolver este problema agregando el siguiente código en su clase principal donde ha iniciado el servidor 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
Author: Loyola A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-02 12:58:30

Solo una aclaración menor

Use

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

No

com.sun.jersey.*

Funcionó para mí solo cuando se usa org.glassfish.jersey.media.multipart.*

En ApplicationConfig simplemente registre MultiPartFeature como

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
Author: Rauan Argyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-02 20:00:20