Я пытаюсь отправить объект, извлеченный из хранилища данных Google App Engine, на страницу JSP. В моем сервлете я вижу, что сущность восстановлена правильно (я зарегистрировал свойство). Но почему-то при отправке ответа на страницу JSP я получаю ошибку, упомянутую в моем заголовке.

Вот мой код сервлета: 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!

1
Abhishek Ghosh 28 Май 2017 в 05:13

2 ответа

Лучший ответ

Согласно комментарию @ pacifier21, я понял, что проблема была в конфигурации маршрутизации, которая у меня была: /tweet/*. Маршрут был рекурсивно сопоставлен, и, следовательно, во второй раз это было только строковое имя файла jsp, что привело к ошибке.

В итоге я изменил маршрут на /tweet и передал идентификатор в виде параметра строки запроса: /tweet?id=123.

Хотелось бы, чтобы был лучший способ передачи данных с помощью URL, например: /tweet/<int:id> - как доступно во всех известных инфраструктурах!

0
Abhishek Ghosh 28 Май 2017 в 06:45

Я не очень много работал над Java, но, глядя на журнал, кажется, проблема в NumberFormatException TweetPermalinkController.java:30

Я бы посоветовал лучше обработать ошибку, чтобы код не выполнялся дальше, если «id» не может быть преобразован. В целях отладки вы можете выйти / вернуться.

0
Ashesh Bharadwaj 28 Май 2017 в 06:40