Je cherche à utiliser l'injection "@Resource String ..." disponible dans les conteneurs servlet 3.0+ pour fournir facilement des paramètres de configuration aux servlets. Je voudrais que les valeurs par défaut fonctionnent et échouent si la clé n'est pas présente dans JNDI (indiquant une erreur de configuration)Erreur @Resource: "Naming binding existe déjà pour foo.NewServlet/userName dans l'espace de noms"
J'ai joué avec une simple servlet dans Netbeans 8.2 avec Glassfish 4.1.1 où je voudrais avoir le champ userName
et le setFullName(String fullName)
ensemble:
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
}
sans « web.xml » les champs sont juste nuls (et pas d'échec). J'ai ensuite joué avec "web.xml" pour voir comment je pourrais le définir. Le nom "java: comp/env/foo: NewServlet/fullName" est ce que Glassfish 4.1.1 semble créer comme nom pour le setter 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>
Cela échoue avec
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]@}
Il n'y a rien d'autre que ces deux fichiers dans le projet. Apparemment, je me méprends sur quelque chose de fondamental, mais lire le didacticiel Java EE et rechercher des suggestions ne m'a pas aidé. Je voudrais vraiment deux choses:
- Ou ne pas fournir des conseils à la ressource balise @ en utilisant les paramètres par défaut générés par conteneur ou tout simplement une clé comme « our.application.fullName ».
- Echoue bruyamment si quelque chose ne va pas, y compris la valeur-clé non présente.
Suggestions? Une bonne réponse donnera une prime de 500 points.
Une question distincte s'est ouverte sur le comportement de Wildfly/Glassfish - https://stackoverflow.com/q/45716813/53897 –