web-dev-qa-db-fra.com

Source d'injection Jersey 2 pour les données en plusieurs parties

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.

26
JasonPlutext

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:

Sur le serveur (serveur http):

final ResourceConfig resourceConfig = new ResourceConfig(MultiPartResource.class);
resourceConfig.register(MultiPartFeature.class);

Côté serveur (déploiement de servlet):

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

web.xml

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

Du côté du client:

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 .

37
Arul Dhesiaseelan

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.

27
Ed Pike

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));
    }
}
3
Half_Duplex

J'utilisais Jersey 2.7 et recevais la même erreur. Il s'est résolu en passant à Jersey 2.9

0
Karmie

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

0
Pranoy Sarkar