Spring 3 MVC:Java语言错误,属性“dataSource”是必需的,如何正确设置JdbcTemplate?

6ljaweal  于 2023-01-08  发布在  Spring
关注(0)|答案(3)|浏览(98)

我是Spring开发的新手。现在,我真的面临着一个问题。这里有一些代码片段,让你清楚地意识到我的问题............
下面是我的DAO类:

public class LoginDaoImpl {

    private DataSource dataSource;              
    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public int checkLoginDetails(LoginVo loginVo){
        String sql = "select count(*) from empsctygrp where username=? and password=?";
        jdbcTemplate = new JdbcTemplate(dataSource);  
        int count = jdbcTemplate.queryForObject(sql,new Object[]{loginVo.getUserName(),loginVo.getPassword()},Integer.class);
        return count;
    }   
}

下面是我的业务对象(BO)类:

public class LoginBo {

    LoginDaoImpl loginDaoImpl = new LoginDaoImpl();

    public int checkLoginDetails(LoginVo loginVo){      
        return loginDaoImpl.checkLoginDetails(loginVo);
    }
}

下面是我的dispatcher-servlet xml代码:

<bean id="dataSource" 
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
  <property name="url" value="jdbc:oracle:thin:@117.194.83.9:1521:XE"/>
  <property name="username" value="system"/>
  <property name="password" value="password1$"/>
</bean>                                     

<bean id="loginDaoImpl" class="com.abhinabyte.dao.LoginDaoImpl">
    <property name="dataSource" ref="dataSource" />
</bean>

现在每当我试图在服务器上运行这个程序时,都会出现以下异常:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/A] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Property 'dataSource' is required] with root cause

java. lang.非法参数异常:属性"dataSource"是必需的
请帮我解决这个问题..........:(

myzjeezk

myzjeezk1#

在LoginBo类中尝试以下操作:

@Autowired
LoginDaoImpl loginDaoImpl;

代替
第一个月
问题在于您手动示例化LoginDaoImpl。

u1ehiz5o

u1ehiz5o2#

我也有同样的问题,在网上找不到一个全面的答案,所以我决定在这里张贴一个给其他人,或未来的我。
我还在学习中,所以如果你认为我在下面犯了错误,请随时编辑。

摘要:

  • 在servlet中包含<integration:annotation-config/> <context:component-scan base-package="myproject"/>以获取注解
  • 使用@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:WEB-INF/FinanceImportTool-servlet.xml")配置JUnit测试
  • 如果dataSourcejdbcTemplate字段已由父类(例如StoredProcedure)提供,则不要自动关联这些字段
  • 不要使用new(),因为这会初始化applicationContext外部的类
  • 注意在构造函数中使用尚未设置的属性--这很明显,但很容易做到

我原来的类(现在更改):

public class MyDAOImpl extends StoredProcedure implements MyDAO {
    private static final String SPROC_NAME = "dbo.MySP";    

    public MyDAOImpl(DataSource dataSource) {
        super(dataSource, SPROC_NAME); 
        // ...declared parameters...
        compile();
    }
}

MyProject-servlet.xml文件(仅包括相关位):

<!-- Used by Spring to pick up annotations -->
<integration:annotation-config/>
<context:component-scan base-package="myproject"/>

<bean id="MyDAOBean" class="myproject.dao.MyDAOImpl" >
    <constructor-arg name="dataSource" ref="myDataSource"/>
</bean>

<!-- properties stored in a separate file -->
<bean id="myDataSource" class="com.microsoft.sqlserver.jdbc.SQLServerDataSource">
    <property name="databaseName" value="${myDataSource.dbname}" />
    <property name="serverName" value="${myDataSource.svrname}" />
    <!-- also loaded portNumber, user, password, selectMethod -->
</bean>

错误:需要属性“dataSource”,或出现NullPointerException(1)

其他答案是确保已经将dataSource作为servlet中bean的<property>传递,等等。
我认为@Abhinabyte the OP需要用@Annotation注解他的setDataSource()方法,并在他的servlet中使用<integration:annotation-config/> <context:component-scan base-package="myproject"/>,以成功地将dataSource作为对LoginDaoImpl的依赖项传入。
在我的例子中,我尝试将“dataSource”添加为属性并自动绑定它,“dataSource是必需的”错误消息变成了NullPointerException错误。
过了很长时间,我才意识到MyDAOImpl扩展了StoredProcedure
dataSource已经是StoredProcedure的属性。由于MyDAOImpl具有dataSource属性,因此自动装配不会拾取和设置StoredProceduredataSource属性,从而使StoredProceduredataSource保留为空。
当我测试MyDAOImpl.dataSource的值时,没有发现这个问题,当然,到目前为止,我已经添加了一个MyDAOImpl.dataSource字段,该字段已经成功地自动连接,但是从StoredProcedure继承的compile()方法使用了StoredProcedure.dataSource
因此,我不需要MyDAOImpl类中的public DataSource dataSource;属性。我只需要在MyDAOImpl的构造函数中使用StoredProcedure构造函数和super(dataSource, sql);
我也不需要MyDAOImpl.jdbcTemplate属性,它是使用StoredProcedure(dataSource, sql)构造函数自动设置的。

错误:空指针异常(2)

我一直在使用这个构造函数:

private static final String SPROC_NAME = "dbo.MySP";

public MyDAOImpl(DataSource dataSource) {
    super(dataSource, SPROC_NAME);
}

这导致了NullPointerException,因为SPROC_NAME在构造函数中使用之前没有初始化(是的,我知道,新手错误)。为了解决这个问题,我在servlet中传入了sql作为构造函数参数。

错误:[更改文件名时出现相同的错误消息]

applicationContext引用了我的bean和类的bin/示例,我不得不删除bin/并重新构建项目。

我的新班级:

public class MyDAOImpl extends StoredProcedure implements MyDAO {

   @Autowired // Necessary to prevent error 'no default constructor found'
   public MyDAOImpl(DataSource dataSource, String sql) {
       super(dataSource, sql);
        // ...declared parameters...
        compile();
   }

新的MyProject-servlet.xml文件(仅包括相关位):

<!-- Used by Spring to pick up annotations -->
<integration:annotation-config/>
<context:component-scan base-package="myproject"/>

<bean id="myDAOBean" class="org.gosh.financeimport.dao.MyDAOImpl" >
    <constructor-arg name="dataSource" ref="reDataSource"/>
    <constructor-arg name="sql" value="dbo.MySP" />
</bean>

<!-- properties stored in a separate file -->
<bean id="myDataSource" class="com.microsoft.sqlserver.jdbc.SQLServerDataSource">
    <property name="databaseName" value="${myDataSource.dbname}" />
    <property name="serverName" value="${myDataSource.svrname}" />
    <!-- also loaded portNumber, user, password, selectMethod -->
</bean>

有用的地方:
如果你能克服愤怒,Spring论坛上的this answer可能也会有所帮助
This answer全面介绍了Spring配置
This answer有简单但有用的建议

of1yzvn4

of1yzvn43#

你应该注解那些会遭受IoC的bean。比如

@Bean public class LoginDAOImpl { @Inject DataSource dataSource;......}

您在Spring上下文中设置了这个bean,但是,您没有使用它们。
组织分解结构:
当我使用JDBCTemplate时,我配置JDBC的de IoC如下

<bean id="dataSourcePerfil" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${br.com.dao.jdbc.driver}" /> 
    <property name="url" value="${br.com.dao.jdbc.url}" /> 
    <property name="username" value="${br.com.dao.jdbc.user}" /> 
    <property name="password" value="${br.com.dao.jdbc.pass}" /> 
</bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSourcePerfil" />
</bean>

那么...毕竟

@Bean

公共类登录DAOImpl {

@Autowired
private JdbcTemplate jdbcTemplate;

@Override
public List<ClienteReport> getClientes() {
    return Collections<ClienteReport>. emptyList();
}

}

相关问题