J'ai eu une méthode:
@POST
@Consumes("multipart/form-data")
@Produces( {"text/xml"})
public Response processForm(
@FormDataParam("myparam") InputStream is,
@FormDataParam("myparam") FormDataContentDisposition detail)
qui a bien fonctionné avec Jersey 1.x.
Je passe à 2.0 m11.
Maintenant, j'obtiens l'erreur suivante:
12/01/2013 11:15:04 AM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.0-m11 2012-12-21 12:34:15...
12/01/2013 11:15:04 AM org.glassfish.jersey.internal.Errors processErrors
SEVERE: The following errors and warnings have been detected:
WARNING: No injection source found for a parameter of type public javax.ws.rs.core.Response com.plutext.FileUpload.processForm(Java.io.InputStream,org.glassfish
.jersey.media.multipart.FormDataContentDisposition) at index 0.
J'ai trouvé http://Java.net/jira/browse/JERSEY-1413 et commit http://Java.net/projects/jersey/lists/commits/archive/2012-09/message/126 qui semble pertinent, mais ce n’est pas évident pour moi de résoudre le problème.
MIS À JOUR
J'ai créé une servlet qui s'exécute dans Tomcat avant l'initialisation de org.glassfish.jersey.server.ApplicationHandler:
public class Jersey2Init extends HttpServlet {
private static final Logger jul = Logger.getLogger(Jersey2Init.class
.getName());
static {
System.out.println("\n\nrunning Jersey2Init\n\n");
final ResourceConfig resourceConfig1 = new ResourceConfig(XFormService.class);
resourceConfig1.registerInstances(new LoggingFilter(jul, true));
resourceConfig1.register(MultiPartFeature.class);
final ResourceConfig resourceConfig2 = new ResourceConfig(AssembleService.class);
resourceConfig2.registerInstances(new LoggingFilter(jul, true));
resourceConfig2.register(MultiPartFeature.class);
}
}
C'est en cours d'exécution en premier:
INFO: Deploying web application archive C:\Java\Apache-Tomcat-7.0.29\webapps\Foo-Services.war
running Jersey2Init
18/01/2013 9:09:51 PM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.0-m11 2012-12-21 12:34:15...
18/01/2013 9:09:52 PM org.glassfish.jersey.internal.Errors processErrors
SEVERE: The following errors and warnings have been detected:
Mais je reçois toujours la même erreur.
Vous devez activer la fonctionnalité MultiPart sur votre application. L'activation de cette fonctionnalité injecte les lecteurs de corps de message nécessaires et les rédacteurs dans votre application Jersey 2. Voici comment vous les enregistrez:
final ResourceConfig resourceConfig = new ResourceConfig(MultiPartResource.class);
resourceConfig.register(MultiPartFeature.class);
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import javax.ws.rs.core.Application;
import Java.util.HashSet;
import Java.util.Set;
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<Class<?>>();
// register resources and features
classes.add(MultiPartFeature.class);
classes.add(MultiPartResource.class);
classes.add(LoggingFilter.class);
return classes;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Jersey Servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.aruld.jersey.multipart.MyApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
final ClientConfig clientConfig = new ClientConfig();
clientConfig.register(MultiPartFeature.class);
Client client = ClientFactory.newClient(clientConfig);
J'ai rassemblé un échantillon de bout en bout de Jersey 2 MultiPart dans Github ici .
J'essayais d'utiliser Jersey 2 pour fileupload. Je voulais éviter de créer une classe Application ou ResourceConfig personnalisée pour activer MultiPart. Il n'est pas bien documenté, mais si vous souhaitez ajouter une fonctionnalité Multipart, il vous suffit d'ajouter ceci à votre configuration de servlet Jersey dans le fichier 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>
Comme vous pouvez le constater, j’ai également ajouté un filtre de journalisation.
Et en utilisant une instance d'application annotée ...
@ApplicationPath("restAPI")
public class ServiceApplication extends ResourceConfig {
public ServiceApplication() {
register(JAXBContextResolver.class);
register(JacksonFeature.class);
register(MultiPartFeature.class);
registerInstances(new LoggingFilter(Logger.getLogger(ServiceApplication.class.getName()), true));
}
}
J'utilisais Jersey 2.7 et recevais la même erreur. Il s'est résolu en passant à Jersey 2.9
Après beaucoup de difficultés, je me suis rendu compte que vous deviez importer import org.glassfish.jersey.media.multipart.FormDataParam;
et non import javax.ws.rs.FormParam;
pour pouvoir utiliser @FormDataParam
.