web-dev-qa-db-ja.com

マルチパートフォームデータ用のJersey 2インジェクションソース

私には方法がありました:

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

jersey 1.xでは問題なく動作しました。

2.0 m11にアップグレードしています。

今、私は次のエラーを受け取ります:

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.

私が見つけた http://Java.net/jira/browse/JERSEY-141 とコミット http://Java.net/projects/jersey/lists/commits/archive/2012- 09/message/126 これは関連しているように見えますが、問題を解決するために何をすべきかは私には明らかではありません。

[〜#〜] updated [〜#〜]

Org.glassfish.jersey.server.ApplicationHandlerが初期化される前にTomcatで実行されるサーブレットを作成しました。

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

それは間違いなく最初に実行されています:

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:

しかし、私はまだ同じエラーを受け取ります。

28
JasonPlutext

アプリケーションでMultiPart機能を有効にする必要があります。この機能を有効にすると、必要なメッセージ本文リーダー、ライターがJersey 2アプリケーションに挿入されます。登録方法は次のとおりです。

サーバー側(httpサーバー):

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

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>

クライアント側で:

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

エンドツーエンドのJersey 2 MultiPartサンプルをGithub here にまとめました。

40

ファイルのアップロードにJersey 2を使用しようとしていました。 MultiPartを有効にするために、カスタムのApplicationクラスまたはResourceConfigクラスを作成しないようにしました。十分に文書化されていませんが、マルチパート機能を追加する場合は、web.xmlのJerseyサーブレット設定にこれを追加するだけです。

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

ご覧のとおり、loggingfilterも追加しました。

27
Ed Pike

そして、注釈付きのアプリケーションインスタンスを使用して...

@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

Jersey 2.7を使用していて、同じエラーが発生していました。 Jersey 2.9にアップグレードすることで解決しました

0
Karmie

たくさん苦労した後、あなたはimport org.glassfish.jersey.media.multipart.FormDataParam; not import javax.ws.rs.FormParam;を使用して、@FormDataParam

0
Pranoy Sarkar