【问题标题】:Resource not found Jersey 2.x找不到资源 Jersey 2.x
【发布时间】:2015-07-02 09:16:47
【问题描述】:

我正在尝试创建一个网络服务来将文件上传到服务器。我无法访问服务并且总是得到 404 错误,即找不到资源。我无法弄清楚我的代码有什么问题。请帮忙。

下面是我的 web.xml。我还注册了其他资源,例如登录、注册和曲目,这些资源通过 ajax 请求可以正常工作,但上传器网络服务无法正常工作。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <display-name>mixtri</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <display-name>mixtri</display-name>
 <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
     <!-- Register resources and providers under com.vogella.jersey.first package. -->
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.mixtri.tracks,com.mixtri.login,com.mixtri.signup,com.mixtri.uploader</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>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

下面是我的 html 表单的标记:

<form method="post" action="/mixtri/rest/upload"
                enctype="multipart/form-data">
                <table align="center" border="1" bordercolor="black" cellpadding="0"
                    cellspacing="0">
                    <tr>
                        <td>Select Zip File :</td>
                        <td><input type="file" name="uploadFile" size="100" /></td>
                    </tr>
                    <tr>
                        <td><input type="submit" value="Upload File" /></td>
                        <td><input type="reset" value="Reset" /></td>
                    </tr>
                </table>
            </form>

这是我的资源类:

package com.mixtri.uploader;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;

import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

@Path("/rest")
public class FileServiceImpl implements IFileService {

    public static final String UPLOAD_FILE_SERVER = "D:/Demo/upload/";

    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadZippedFile(
            @FormDataParam("uploadFile") InputStream fileInputStream,
            @FormDataParam("uploadFile") FormDataContentDisposition fileFormDataContentDisposition) {

        // local variables
        String fileName = null;
        String uploadFilePath = null;

        try {
            fileName = fileFormDataContentDisposition.getFileName();
            uploadFilePath = writeToFileServer(fileInputStream, fileName);
        }
        catch(IOException ioe){
            ioe.printStackTrace();
        }
        finally{
            // release resources, if any
        }
        return Response.ok("File uploaded successfully at " + uploadFilePath).build();
    }

    /**
     * write input stream to file server
     * @param inputStream
     * @param fileName
     * @throws IOException
     */
    private String writeToFileServer(InputStream inputStream, String fileName) throws IOException {

        OutputStream outputStream = null;
        String qualifiedUploadFilePath = UPLOAD_FILE_SERVER + fileName;

        try {
            outputStream = new FileOutputStream(new File(qualifiedUploadFilePath));
            int read = 0;
            byte[] bytes = new byte[1024];
            while ((read = inputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, read);
            }
            outputStream.flush();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        finally{
            //release resource, if any
            outputStream.close();
        }
        return qualifiedUploadFilePath;
    }
}

任何指针都会有所帮助。

【问题讨论】:

  • 这表明您的服务没有启动。您能否添加一个虚拟 GET 方法来检查您的 url(或表单路径)是否为真?

标签: java web-services rest jersey-2.0


【解决方案1】:

您可以将FileServiceImpl 中的@Path("/rest") 更改为@Path("/")。或者您可以将其更改为 @Path("/upload") 并将其从 uploadZippedFile 方法中删除。

您已经在此处将 /rest 定义为 Jersey 应用的根映射

<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

所以最终你的路径需要是

action="/mixtri/rest/rest/upload"

如果您不更改注释。

【讨论】:

  • 非常感谢您发现这一点。那是个愚蠢的错误。我的登录和注册模块工作得很好,只是这样注释。在类级别我只有@Path('/'),​​然后在方法级别我有@Path('/login')。我在这方面犯的错误是在课堂级别,我正在编写 @('/rest') ,它已经在上下文根中定义。所以我刚刚删除了在类级别将其更改为 @('/') 并在方法级别 Path@('/upload') 和操作保持相同,操作为 action ="/mixtri/rest/upload" 并且它有效。 :-) 谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
相关资源
最近更新 更多