【问题标题】:"java.lang.IllegalArgumentException: id cannot be zero" When sending GAE Entity to JSP“java.lang.IllegalArgumentException:id 不能为零”将 GAE 实体发送到 JSP 时
【发布时间】:2017-05-28 02:13:33
【问题描述】:

我正在尝试将从 Google App Engine 的数据存储区检索到的实体发送到 JSP 页面。在我的 servlet 中,我可以看到实体已正确恢复(我记录了一个属性)。但不知何故,在将响应发送回 JSP 页面时,我得到了标题中提到的错误。

这是我的 Servlet 代码:TweetPermalinkController.java

package com.socialwebapp;

import java.io.IOException;
// import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

@SuppressWarnings("serial")
public class TweetPermalinkController extends HttpServlet {
    
//  private static final Logger log = Logger.getLogger(NewTweetController.class.getName());
    
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        String id = req.getPathInfo().split("/")[1];
        System.out.println("25: " + id);
        
        long tweetId = 0;
        
        try{
            tweetId = Long.parseLong(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("35: " + tweetId);
        
        Entity tweet = null;
        DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
        
        Key tweetKey = KeyFactory.createKey("Tweet", tweetId);
        
        try {
            tweet = ds.get(tweetKey);
            
            System.out.println((String) tweet.getProperty("message"));
            
            resp.setContentType("text/html");
            req.setAttribute("id", tweetId);
            req.setAttribute("tweet", tweet);
            req.getRequestDispatcher("show_tweet.jsp").forward(req, resp);
        } catch (EntityNotFoundException e) {
            e.printStackTrace();
        }
    }

}

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"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  
  <servlet>
    <servlet-name>IndexPage</servlet-name>
    <servlet-class>com.socialwebapp.HomePageController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>IndexPage</servlet-name>
    <url-pattern>/home</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>NewTweetPage</servlet-name>
    <servlet-class>com.socialwebapp.NewTweetController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>NewTweetPage</servlet-name>
    <url-pattern>/new_tweet</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>TweetPermalinkPage</servlet-name>
    <servlet-class>com.socialwebapp.TweetPermalinkController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TweetPermalinkPage</servlet-name>
    <url-pattern>/tweet/*</url-pattern>
  </servlet-mapping>
  
</web-app>

JSP:show_tweet.jsp

<h2>Show Single Tweet</h2>

这是我在控制台中看到的日志和错误: https://pastebin.com/gqKvTVBK


我不明白为什么我看到下面几行的第 4 行。前 3 行符合预期,我不明白为什么我看到我的 jsp 文件的名称,我什至没有在任何地方记录它:

25: 6544293208522752

35: 6544293208522752

新的

25:show_tweet.jsp

java.lang.NumberFormatException:对于输入字符串:“show_tweet.jsp”35: 0


我花了半天时间试图弄清楚这一点。任何帮助或指导将不胜感激。

这里是回购链接:https://github.com/ghoshabhi/SocialWebApp/

TIA!

【问题讨论】:

  • 函数的第一行写System.out.println(req.getPathInfo())看看路径是什么。看起来这个函数正在响应 /tweet/show_tweet.jsp 以及 /tweet/some-id。然后,找出使用 /tweet/show_tweet.jsp 地址调用此函数的原因。

标签: java jsp google-app-engine servlets


【解决方案1】:

我在 java 上工作不多,但查看日志似乎是 NumberFormatException TweetPermalinkController.java:30

我建议更好地处理错误,以便在“id”无法转换时代码不会进一步执行。出于调试目的,您可能想要 退出/返回。

【讨论】:

    【解决方案2】:

    根据@pacifier21 的评论,我意识到问题出在我的路由配置上:/tweet/*。路由是递归匹配的,所以第二次只是jsp文件的字符串名,导致报错。

    我最终将路由更改为 /tweet 并将 ID 作为查询字符串参数传递:/tweet?id=123

    我希望有更好的方法通过 URL 传递数据,例如:/tweet/&lt;int:id&gt; - 就像在所有著名的框架中一样!

    【讨论】:

    • 你确定没有吗? Java没有变量吗?还是字符串转义的东西?像 python ("Hello %s" % "Abhishek")。或者甚至是装饰师?
    • @DaniSpringer:不幸的是我找不到它。就像我提到的那样,它应该很简单:/tweet/&lt;int:id&gt;。可能像 Spring 这样的其他框架可能有它!
    • 希望如此。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2021-08-03
    • 2013-04-27
    • 2011-05-09
    相关资源
    最近更新 更多