首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用RESTful服务时的FileNotFoundException

调用RESTful服务时的FileNotFoundException
EN

Stack Overflow用户
提问于 2019-06-20 02:05:18
回答 2查看 511关注 0票数 0

我设置的一个简单的REST调用在运行时给了我一个文件找不到的异常。我查找了错误,知道URL找不到任何东西,但我不知道为什么。在我看来,REST servlet设置得很好,但是不知何故,URL没有映射到它内部实现的操作。一个类似的教程项目可以完美地工作,但不是这个项目,尽管它们的配置几乎完全相同:

输出:

代码语言:javascript
运行
复制
{"username":"AchillesV3","password":"affirmation","email":"jason@cave-gaming.com"}

Error while calling Crunchify REST Service
java.io.FileNotFoundException: http://localhost:8080/arenamaster-backend/api/player/post
java.io.FileNotFoundException: http://localhost:8080/arenamaster-backend/api/player/post
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1890)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    at RESTServiceClient.main(RESTServiceClient.java:43)

PlayerService.java

代码语言:javascript
运行
复制
package services;

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 org.springframework.web.bind.annotation.CrossOrigin;

import objects.*;

@Path("/player")
public class PlayerService {

    @GET
    @Path("/get")
    @Produces(MediaType.TEXT_PLAIN)
    //@CrossOrigin
    public String getTestString() {

        return "Get success";

    }

    @POST
    @Path("/post")
    //@CrossOrigin
    @Consumes(MediaType.APPLICATION_JSON)
    public Response registerNewPlayer(PlayerRegisterRequest new_player) {

        String result = "Player saved : " + new_player;
        return Response.status(201).entity(result).build();

    }

}

Rest客户端:

代码语言:javascript
运行
复制
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

import org.codehaus.jettison.json.JSONObject;

public class RESTServiceClient {
    public static void main(String[] args) {
        String string = "";
        try {

            // Step1: Let's 1st read file from fileSystem
            // Change CrunchifyJSON.txt path here
            InputStream crunchifyInputStream = new FileInputStream("JSON.txt");
            InputStreamReader crunchifyReader = new InputStreamReader(crunchifyInputStream);
            BufferedReader br = new BufferedReader(crunchifyReader);
            String line;
            while ((line = br.readLine()) != null) {
                string += line + "\n";
            }

            JSONObject jsonObject = new JSONObject(string);
            System.out.println(jsonObject);

            // Step2: Now pass JSON File Data to REST Service
            try {
                URL url = new URL("http://localhost:8080/arenamaster-backend/api/player/post");
                URLConnection connection = url.openConnection();
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setRequestProperty("Content-Type", "application/json");
                connection.setConnectTimeout(5000);
                connection.setReadTimeout(5000);
                OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
                out.write(jsonObject.toString());
                out.close();

                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

                String line_in;

                while ((line_in = in.readLine()) != null) {
                    System.out.println(line_in);
                }
                System.out.println("\nCrunchify REST Service Invoked Successfully..");
                in.close();
            } catch (Exception e) {
                System.out.println("\nError while calling Crunchify REST Service");
                e.printStackTrace();
                System.out.println(e);
            }

            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

web.xml

代码语言:javascript
运行
复制
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>services</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/api/*</url-pattern>
  </servlet-mapping>

</web-app>
EN

回答 2

Stack Overflow用户

发布于 2019-06-20 02:18:50

通过在Player类中进行以下更改来试用:

代码语言:javascript
运行
复制
@Controller
@RequestMapping("/arenamaster-backend/api/player/")
public class PlayerService {

}

并将具有适当返回内容类型的@Produces注释添加到registerNewPlayer方法中,如下所示:

代码语言:javascript
运行
复制
@Produces(MediaType.TEXT_PLAIN)

而不是

代码语言:javascript
运行
复制
    InputStream crunchifyInputStream = new FileInputStream("JSON.txt");

提供文件JSON.txt的完整路径,如下所示

代码语言:javascript
运行
复制
InputStream crunchifyInputStream = new FileInputStream("C:\\JSON.txt");
票数 0
EN

Stack Overflow用户

发布于 2019-06-20 09:37:01

我使用Maven的命令行协议创建了一个新项目,修复了这个问题。似乎错误出在文件结构上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56673497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档