【发布时间】:2018-01-24 08:45:41
【问题描述】:
我正在考虑使用 servlet 3.0+ 容器中可用的“@Resource String ...”注入来轻松地向 servlet 提供配置参数。如果 JNDI 中不存在密钥(表示配置错误),我希望默认值能够正常工作并失败
我在带有 Glassfish 4.1.1 的 Netbeans 8.2 中玩弄了一个简单的 servlet,我希望在其中设置 userName 字段和 setFullName(String fullName) 设置:
package foo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "NewServlet", urlPatterns = {"/NewServlet"})
public class NewServlet extends HttpServlet {
@Resource(description="user name")
String userName;
private String fullname;
@Resource()
public void setFullName(String fullName){
this.fullname = fullName;
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet NewServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("Full name = " + fullname);
out.println("<h1>Servlet NewServlet at " + request.getContextPath() + "</h1>");
out.println("Username = " + userName);
out.println("</body>");
out.println("</html>");
}
}
// Autogenerated stuff omitted
}
没有“web.xml”,这些字段只是空的(并且没有失败)。然后我玩弄了“web.xml”,看看我如何定义它。 “java:comp/env/foo:NewServlet/fullName”名称是 Glassfish 4.1.1 似乎创建为 fullName 设置器的名称。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<env-entry >
<env-entry-name>java:comp/env/foo.NewServlet/fullName</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>!BAR!</env-entry-value>
</env-entry>
<env-entry >
<env-entry-name>java:comp/env/foo.NewServlet/userName</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>!USERNAME!</env-entry-value>
</env-entry>
</web-app>
然后失败并显示
Severe: Exception while deploying the app [WebApplication4] : Naming binding already exists for foo.NewServlet/userName in namespace {java:module/env/foo.NewServlet/userName=Env-Prop: java:comp/env/foo.NewServlet/userName@Non-Injectable Resource@java.lang.String@!USERNAME!@@, java:module/env/foo.NewServlet/fullName=Env-Prop: java:comp/env/foo.NewServlet/fullName@Non-Injectable Resource@java.lang.String@!BAR!@@}
项目中只有这两个文件。显然我误解了一些基本的东西,但是阅读 Java EE 教程和搜索建议并没有帮助我。我真的很想要两件事:
- 要么不使用容器生成的默认值向 @Resource-tag 提供任何提示,要么仅使用“our.application.fullName”之类的键。
- 如果出现任何错误(包括键值不存在),请大声失败。
建议?一个好的答案将给予 500 点赏金。
【问题讨论】:
-
关于 Wildfly/Glassfish 行为的单独问题 - stackoverflow.com/q/45716813/53897
标签: java servlets jakarta-ee jndi servlet-3.0