Ich schaue mit der "@Resource String ..." Injektion in Servlet 3.0+ Container für die Bereitstellung von Konfigurationsparametern leicht zu Servlets. Ich möchte für die Standardeinstellungen funktionieren und fehlschlagen, wenn der Schlüssel nicht in JNDI (Angabe eines Konfigurationsfehlers)@Resource-Fehler: "Naming Bindung existiert bereits für foo.NewServlet/userName im Namespace"
Ich habe mit einem einfachen Servlet in Netbeans 8.2 mit Glassfish 4.1.1 gespielt, wo ich möchte userName
Feld und der setFullName(String fullName)
Satz:
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
}
Ohne "web.xml" die Felder sind nur null (und kein Fehler). Ich habe dann mit "web.xml" herumgespielt, um zu sehen, wie ich das definieren könnte. Der Name "java: comp/env/foo: NewServlet/vollständigerName" wird von Glassfish 4.1.1 als Name für den FullName-Setter erstellt.
<?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>
Dies scheitert dann mit
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/[email protected] [email protected]@[email protected]@, java:module/env/foo.NewServlet/fullName=Env-Prop: java:comp/env/foo.NewServlet/[email protected] [email protected]@[email protected]@}
Es gibt nichts anderes, als diese beiden Dateien in das Projekt. Anscheinend verstehe ich etwas Grundlegendes falsch, aber das Lesen des Java EE Tutorials und das Suchen nach Vorschlägen hat mir nicht geholfen. Ich würde wirklich gerne zwei Dinge:
- Entweder keine Hinweise auf die @ Ressource-Tag Bereitstellung der Container erzeugt standardmäßig oder einfach nur einen Schlüssel wie „our.application.fullName“ verwenden.
- Fehlgeschlagen laut, wenn etwas falsch ist, einschließlich des Schlüsselwerts, der nicht vorhanden ist.
Vorschläge? Eine gute Antwort wird eine 500 Punkte Kopfgeld geben.
Getrennte Frage auf Wildfly/Glassfish Verhalten geöffnet - https://stackoverflow.com/q/45716813/53897 –