我有简单的servlet项目: 我需要为servlet实例注入依赖项。我尝试了几个注释:默认, Singlton , EJB , ManagedBean ,没有任何帮助。
POM.xml的一部分
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${endorsed.dir}</outputDirectory>
<silent>true</silent>
<artifactItems>
<artifactItem>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>7.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
的Servlet
@WebServlet(urlPatterns = {"/updater_servlet"},loadOnStartup = 1)
public class Updater_servlet extends HttpServlet
{
private final static org.slf4j.Logger logger = LoggerFactory.getLogger(Updater_servlet.class);
@Inject
private UpdatesModel updates;
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
...
}
模型类
@Model
public class UpdatesModel implements Serializable
{
private final static org.slf4j.Logger logger = LoggerFactory.getLogger(UpdatesModel.class);
private final String url;
private final String username;
private final String password;
private final String instpath;
public UpdatesModel()
{
Properties prop = new Properties();
try
{
Class.forName(driverName);
prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"));
}
catch (ClassNotFoundException|IOException ex)
{
Logger.getLogger(UpdatesModel.class.getName()).log(Level.SEVERE, null, ex);
}
url = "jdbc:mysql://" + serverName + "/" + prop.getProperty("database","");
username = prop.getProperty("dbuser","");
password = prop.getProperty("dbpassword","");
instpath = prop.getProperty("instpath","");
}
更新字段永远不会初始化。它等于null。我做错了什么?
更新: 依赖关系:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.8</version>
<scope>test</scope>
</dependency>
</dependencies>
我在WEB-INF中创建了空beans.xml - 没有帮助(( 我部署到Tomcat 7.还尝试了tomcat 8 - 没有区别((
答案 0 :(得分:3)
首先,pom.xml
的大块与问题完全无关;)依赖项部分会更有趣。
创建或确保它在beans.xml
目录中存在名为WEB-INF
的空文件。
确保您在pom.xml
:
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<scope>provided</scope>
<version>version</version>
</dependency>
还要确保将战争部署到支持CDI的应用程序服务器(如Wildfly(JBoss)),或者确保在类路径上有所有必需的库,如果它只是像Tomcat这样的servlet容器。
向接口注入具体实现也是一种好习惯,因此您的UpdatesModel
类应该实现一些指定其行为的接口。但这不是必要的。
编辑:只有在SE环境中才需要焊接依赖性。在EE中,所有需要的都应该是cdi-api
。
答案 1 :(得分:0)
我发现了如何解决这个问题。我添加了
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>1.1.10.Final</version>
</dependency>
到pom.xml并创建了UpdaterRequestListener
@WebListener
public class UpdaterRequestListener extends org.jboss.weld.environment.servlet.Listener
{
}
我想知道如果没有额外的焊接依赖性我是否可以做到这一点?是否有javax替代方案?