これは私を狂わせてきました。
だから私は(非常に単純なバニラサーブレット3)Webアプリを持っています。Eclipseで実行すると、すべて問題ありません。特に、Unicode(ギリシャ語)ユーザー名でアカウントを登録してから、サイト管理者としてログインし、ユーザーのプロファイルにアクセスすることができます。warをにエクスポートし $CATALINA_HOME\webapps
、起動$CATALINA_HOME\bin\startup.bat
し、ブラウザでサイトを開き、adminとしてログインし、ユーザープロファイルにアクセスしてみてください。ユーザー名などは空白で表示されます。
のファイル...\apache-tomcat-7.0.32\conf
とのファイルは、(の)...\eclipse_workspaces\javaEE\Servers\Tomcat v7.0 Server at localhost-config
行のみが異なります。server.xml
<Context docBase="ted2012" path="/ted2012" reloadable="true"
source="org.eclipse.jst.jee.server:ted2012"/>
これは日食です。
プロファイルサーブレットのdoGetメソッド(スリム化):
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
final String username = Helpers.decodeRequest(request
.getParameter("user"));
if (username != null) {
User user = null;
try {
System.out
.println("ProfileController.doGet() user name DECODED : "
+ username);
user = userService.getUserWithUsername(username); // THIS FAILS
System.out.println("ProfileController.doGet() user : " + user);
request.setAttribute("userToShow", user);
} catch (ServiceExDBFailure e) {
log.debug("ProfileController::doGet", e);
request.setAttribute("ErrorString", e.getMessage());
}
sc.getRequestDispatcher(OTHERPROFILE_JSP)
.forward(request, response);
return;
} else {
//does not apply
}
}
デコード方法は次のとおりです。
public static String decodeRequest(String parameter)
throws UnsupportedEncodingException {
if (parameter == null)
return null;
System.out.println("decode - request.getBytes(\"iso-8859-1\"):"
+ new String(parameter.getBytes("iso-8859-1")));
System.out.println("decode - request.getBytes(\"iso-8859-1\") BYTES:"
+ parameter.getBytes("iso-8859-1"));
for (byte iterable_element : parameter.getBytes("iso-8859-1")) {
System.out.println(iterable_element);
}
System.out.println("decode - request.getBytes(\"UTF-8\"):"
+ new String(parameter.getBytes(CHARSET_FOR_URL_ENCODING))); // UTF-8
return URLDecoder.decode(new String(parameter.getBytes("iso-8859-1")),
CHARSET_FOR_URL_ENCODING);
}
db呼び出しは:
statement = conn.prepareStatement(query);
statement.setString(1, username);
System.out.println("ελληναρα");
System.out.println(statement);
set = statement.executeQuery();
if (set.next()) {
User user = new User();
// user.setId(set.getInt("ID"));
user.setUsername(set.getString("username"));
user.setName(set.getString("name"));
user.setSurname(set.getString("surname"));
user.setPassword(set.getString("password"));
user.setEmail(set.getString("email"));
user.setRole(RolesENUM.values()[set.getInt("role")]);
return user; // if the set is empty null is returned
}
Tomcatプリント:
decode - request.getBytes("iso-8859-1"):╧à╧â╧ä╬╡╧?╬╣╬▒
decode - request.getBytes("iso-8859-1") BYTES:[B@529b9ed
-49
-123
-49
-125
-49
-124
-50
-75
-49
-127
-50
-71
-50
-79
decode - request.getBytes("UTF-8"):├?┬à├?┬â├?┬ä├Ä┬╡├?┬?├Ä┬╣├Ä┬▒
ProfileController.doGet() user name DECODED : ╧à╧â╧ä╬╡╧?╬╣╬▒
com.mysql.jdbc.JDBC4PreparedStatement@766d7940: SELECT * FROM users WHERE username='╧à╧â╧ä╬╡╧?╬╣╬▒'
????????
ProfileController.doGet() user : null
Eclipseが印刷している間:
decode - request.getBytes("iso-8859-1"):υστερια
decode - request.getBytes("iso-8859-1") BYTES:[B@4b6a6bdf
-49
-123
-49
-125
-49
-124
-50
-75
-49
-127
-50
-71
-50
-79
decode - request.getBytes("UTF-8"):ÏÏÏεÏια
ProfileController.doGet() user name DECODED : υστερια
com.mysql.jdbc.JDBC4PreparedStatement@37d02427: SELECT * FROM users WHERE username='υστερια'
ελληναρα
ProfileController.doGet() user : com.ted.domain.User@63144ceb
なんらかの理由で、dbに到達するクエリは何かおかしなものだと思います-EclipseのどこがTomcatのελληναραを出力するかに注意してください???????? 一方、Unicodeユーザー名(υστερια)は、???????ではなく╧à╧â╧ä╬╡╧?╬╣╬▒として出力されます。
したがって、問題は、Eclipseデプロイメントとtomcatデプロイメントの間で何が変わるのかということです。DBがnullを返すのはなぜですか?私は本当にこれを無駄にデバッグしようとしました
ヘルプ
編集:行 statement.setString(1, username);
を置き換えてstatement.setString(1, "υστερια");
も失敗はありません。したがって、この行が実行されるまでに、バイトは壊されます-バイトは1つずつ同じであることに注意してください
EDIT2:ローカルホストEclipseでのTomcat v7.0サーバーはVM引数を起動します(読みやすくするために分割):
-Dcatalina.base="C:\Dropbox\eclipse_workspaces\javaEE\.metadata\.plugins
\org.eclipse.wst.server.core\tmp1"
-Dcatalina.home="C:\_\apache-tomcat-7.0.32"
-Dwtp.deploy="C:\Dropbox\eclipse_workspaces\javaEE\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps"
-Djava.endorsed.dirs="C:\_\apache-tomcat-7.0.32\endorsed"