【问题标题】:How to deploy REST web service to AWS?如何将 REST Web 服务部署到 AWS?
【发布时间】:2016-04-09 11:11:25
【问题描述】:

需要做什么?

在 AWS 上使用 Web 服务 (REST) 部署 Web 应用程序。 (Tomcat 服务器)

我做了什么?

使用 REST Web 服务构建 Web 应用程序。本地测试成功。

问题

现在,当我使用弹性 beanstalk 将其部署到 AWS 时,会出现 404 错误。

我的网络服务代码

@Path("/abc")
public class registerService {
    @POST
    @Path("/crunchifyService")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response crunchifyREST(InputStream incomingData) {
        StringBuilder crunchifyBuilder = new StringBuilder();
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(incomingData));
            String line = null;
            while ((line = in.readLine()) != null) {
                crunchifyBuilder.append(line);
            }
        } catch (Exception e) {
            System.out.println("Error Parsing: - ");
        }
        System.out.println("Data Received: " + crunchifyBuilder.toString());

        User userObject = new Gson().fromJson(crunchifyBuilder.toString(), User.class);
        System.out.println("JSon object: " + userObject.getSurname());
        int status = RegisterDao.register(userObject);
        if(status == 1)
        {



        }else{
            System.out.println("Failed again");

        }

        // return HTTP response 200 in case of success
        return Response.status(200).entity(crunchifyBuilder.toString()).build();
    }

    @GET
    @Path("/verify")
    @Produces(MediaType.TEXT_PLAIN)
    public Response verifyRESTService(InputStream incomingData) {
        String result = "CrunchifyRESTService Successfully started..";

        // return HTTP response 200 in case of success
        return Response.status(200).entity(result).build();
    }


     @GET
       @Path("/users")
       @Produces(MediaType.TEXT_PLAIN)
       public Response getUsers(){
          return Response.status(200).entity("Done").build();
       }
}

REST 客户端代码

<%

 String json = new Gson().toJson(u);
System.out.println(json);

try {
  URL url = new URL("http://storageserver-env.sa-east-1.elasticbeanstalk.com/MyApplicationName/api/abc/crunchifyService");
    URLConnection connection = url.openConnection();
    connection.setDoOutput(true);
    connection.setRequestProperty("Content-Type", "application/json");
    connection.setConnectTimeout(5000);
    connection.setReadTimeout(5000);
    OutputStreamWriter out1 = new OutputStreamWriter(connection.getOutputStream());
    out1.write(json);
    out1.close();

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

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

%>

我的服务器日志显示

127.0.0.1 - - [09/Apr/2016:13:38:05 +0000] "POST /SecureStorage/api/abc/crunchifyService HTTP/1.1" 404 1070

**

Web.xml

<?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>SecureStorage</display-name>
  <welcome-file-list>
    <welcome-file>
    createTable.jsp</welcome-file>
  </welcome-file-list>

   <servlet>
      <servlet-name>Application</servlet-name>
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
         <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>registration</param-value>
         </init-param>
      </servlet>
   <servlet-mapping>
   <servlet-name>Application</servlet-name>
      <url-pattern>/api/*</url-pattern>
   </servlet-mapping>
</web-app>

【问题讨论】:

  • 检查您的服务器日志以了解部署失败的原因
  • @MarkB 它只是说这个“127.0.0.1 - - [09/Apr/2016:13:38:05 +0000] “POST /SecureStorage/api/abc/crunchifyService HTTP/1.1”404 1070"
  • 那是你的访问日志,不是你的部署日志
  • @MarkB 链接了我的日志文件
  • 老兄...你需要删除它,里面有你的 AWS 密钥。

标签: java web-services rest tomcat amazon-web-services


【解决方案1】:

在 AWS 上部署 Web 应用程序或 Web 服务没有区别。

您将在 aws 网站上获得有关如何部署 Web 应用程序的精彩教程。

我的问题是什么?

从 rest 客户端调用后,它给了我 404 错误。

它是如何解决的?

在上面 cmets 部分的说明之后,我在我的日志中找到了。

严重 [http-nio-8080-exec-8] org.apache.catalina.core.StandardWrapperValve.invoke 分配 servlet 应用程序 java.lang.NoSuchMethodError 的异常: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;

这是一个实际问题。当类路径上有两个不同版本的类时,会发生此异常。在此之后,我删除了多余的重叠 jar。 More info about above exception

另一个问题 经过上述改进后,预计一切都会正常工作,但在来自休息客户端的服务调用中仍然出现 404 错误代码。

解决方案

我的客户使用了以下格式的 url。

http://storageserver-env.sa-east-1.elasticbeanstalk.com/MyApplicationName/api/abc/crunchifyService

URLGivenByAWSWhereWebAppIsDepoyed/MyApplicationName/ResourcePath

以上网址格式适用于本地地址,即 locahost:8080/MyApplicationName/ResourcePath

但部署后它不起作用。

我尝试从上面的 url 中删除 MyApplicationName 的名称,它成功了。

工作格式

URLGivenByAWSWhereWebAppIsDepoyed/ResourcePath

【讨论】:

  • 我面临同样的问题。就我而言,我收到 204 响应,但未调用方法“crunchifyREST”。我试图记录响应,但没有达到该方法。知道是什么问题吗?服务器日志中没有异常
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 2022-11-04
相关资源
最近更新 更多