无法使用Jax-RS上传文件

时间:2015-07-14 16:00:57

标签: java rest ant glassfish jersey-2.0

我想使用泽西框架。我在Java EE7上使用ant应用程序运行Web服务。我的应用程序服务器是Glassfish

我的方法如下:

 package mypackage.service;
        ...
         import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
        import org.glassfish.jersey.media.multipart.FormDataParam;

        @POST
        @Path("createSomething")
        @Consumes(MULTIPART_FORM_DATA)
        @Produces(APPLICATION_XML)
        public Response createSomething(@FormDataParam("upload") InputStream is, @FormDataParam("upload") FormDataContentDisposition formData, @QueryParam("some") String some,  @Context HttpServletRequest request) {

            String fileLocation = "C:\\UploadFile\\" + formData.getFileName();

        //more things, do not matter

            try {
                ctrl.saveFile(is, fileLocation);
                String result = "Successfully File Uploaded on the path " + fileLocation;
                return Response.status(Response.Status.OK).entity(result).build();
            } catch (IOException e) {
                e.printStackTrace();
                return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();

            }

我还有一个应用程序配置:

package mypackage.service;

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
import org.glassfish.jersey.media.multipart.MultiPartFeature;

@javax.ws.rs.ApplicationPath("")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> resources = new HashSet<>();
        addRestResourceClasses(resources);
        resources.add(MultiPartFeature.class);

        return resources;

    }

    /**
     * Do not modify addRestResourceClasses() method. It is automatically
     * populated with all resources defined in the project. If required, comment
     * out calling this method in getClasses().
     */
    private void addRestResourceClasses(Set<Class<?>> resources) {
        resources.add(mypackage.service.MYSERVICE.class);


    }

}

在myweb.xml上我有:

<servlet>
    <servlet-name>ServletAdaptor</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>mypackage.service.ApplicationConfig</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>mypackage.service</param-value>
    </init-param>
    <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>

    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>ServletAdaptor</servlet-name>
    <url-pattern>/createSomething/*</url-pattern>
</servlet-mapping>

我仍然得到同样的信息:

引起:org.apache.catalina.LifecycleException:org.glassfish.jersey.server.model.ModelValidationException:应用程序初始化期间应用程序资源模型的验证失败。 [[FATAL]找不到类型为public javax.ws.rs.core.Response的参数的注入源

我做错了什么?

2 个答案:

答案 0 :(得分:2)

对我来说很好。虽然我会完全摆脱Application子类。它不是必需的,可能会引起冲突/混淆。您的xml配置足够,只需摆脱javax.ws.rs.Application <init-param>。我还会考虑让多部分罐子只用于编译时罐子(这意味着没有内置于战争中 - 它们可能与Glassfish的版本相冲突)。我对Ant不起作用,所以我不确定你怎么做,但我知道这是可能的。

答案 1 :(得分:0)

以下代码对我有用:

Class->>>添加

Class属性--- >>添加

Public Class userREST () {

@POST
    @Path("upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    public Response uploadImageFile(@FormDataParam("uploadFile") InputStream fileInputStream,
            @FormDataParam("uploadFile") FormDataContentDisposition fileFormDataContentDisposition,
            @FormDataParam("FIR_REG_NUM") String FIR_REG_NUM, @FormDataParam("LOGIN_ID") String LOGIN_ID) {

        final_json_result = WriteFileInFolder.fileAnalysis(fileInputStream, fileFormDataContentDisposition, FIR_REG_NUM,
                LOGIN_ID);

        return Response.ok(final_json_result).build();

    }// uploadImageFile

package ####.jaxrs.jwt;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import ####.helper.Common@@@;
import ####.jaxrs.jwt.filters.JWTRequestFilter;
import ####.jaxrs.jwt.filters.JWTResponseFilter;
import ####.service.FileServicesREST;



@ApplicationPath("fileservice")
public class FileJAXRSConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {

        Common@@@.logging("@ApplicationPath@FileServicesREST...");
        Set<Class<?>> clazzes = new HashSet<Class<?>>();
        clazzes.add(JWTRequestFilter.class);
        clazzes.add(FileServicesREST.class);
        clazzes.add(JWTResponseFilter.class);

        return clazzes;
    }


    @Override
    public Map<String, Object> getProperties() {
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put("jersey.config.server.provider.packages", "####.service");
        properties.put("jersey.config.server.provider.classnames", "org.glassfish.jersey.media.multipart.MultiPartFeature");
        return properties;
    }

}

无需在web.xml中添加以下内容

<init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>mha.@@@.service</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
        </init-param>