web-dev-qa-db-de.com

Jersey 2-Injektionsquelle für mehrteilige Formulardaten

Ich hatte eine Methode:

@POST
@Consumes("multipart/form-data")
@Produces( {"text/xml"})
public Response processForm(
    @FormDataParam("myparam") InputStream is,
    @FormDataParam("myparam") FormDataContentDisposition detail)

was gut mit Jersey 1.x funktionierte.

Ich aktualisiere auf 2.0 m11.

Nun bekomme ich folgende Fehlermeldung:

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.

Ich habe http://Java.net/jira/browse/JERSEY-1413 gefunden und http://Java.net/projects/jersey/lists/commits/archive/2012-09/ message/126 was relevant erscheint, aber mir ist nicht klar, was ich tun soll, um das Problem zu beheben.

AKTUALISIERTE

Ich habe ein Servlet gemacht, das in Tomcat läuft, bevor org.glassfish.jersey.server.ApplicationHandler initialisiert wird:

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

Es läuft definitiv zuerst:

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:

Aber ich bekomme immer noch den gleichen Fehler.

26
JasonPlutext

Sie müssen die MultiPart-Funktion in Ihrer Anwendung aktivieren. Durch Aktivieren dieser Funktion werden die erforderlichen Nachrichtentextleser und -schreiber in Ihre Jersey 2-Anwendung eingefügt. So registrieren Sie sie:

Auf der Serverseite (http-Server):

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

Auf der Serverseite (Servlet-Bereitstellung):

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>

Auf der Clientseite:

final ClientConfig clientConfig = new ClientConfig();
clientConfig.register(MultiPartFeature.class);
Client client = ClientFactory.newClient(clientConfig);

In Github hier habe ich ein komplettes Jersey 2 MultiPart-Sample zusammengestellt.

37

Ich habe versucht, Jersey 2 zum Hochladen von Dateien zu verwenden. Ich wollte vermeiden, eine benutzerdefinierte Application- oder ResourceConfig-Klasse zu erstellen, um MultiPart zu aktivieren. Es ist nicht gut dokumentiert, aber wenn Sie die Multipart-Funktionalität hinzufügen möchten, müssen Sie dies nur Ihrer Jersey-Servlet-Konfiguration in web.xml hinzufügen:

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

Wie Sie sehen, habe ich auch einen Protokollierungsfilter hinzugefügt.

27
Ed Pike

Und mit einer kommentierten Anwendungsinstanz ...

@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

Ich habe Jersey 2.7 benutzt und bekam den gleichen Fehler. Sie löste sich durch ein Upgrade auf Jersey 2.9

0
Karmie

Nachdem ich viel gekämpft hatte, musste ich import org.glassfish.jersey.media.multipart.FormDataParam; nicht import javax.ws.rs.FormParam; importieren, um @FormDataParam verwenden zu können. 

0
Pranoy Sarkar