@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
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
).
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.
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");
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 ...
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;
}
}