Spring 3.1.2 RowMapper参数化

时间:2012-12-11 12:02:04

标签: java spring generics spring-mvc spring-3

我正在使用Spring 3.1.2开发一个Web应用程序,需要创建一个自定义行映射器。我创建了一个实现RowMapper的私有静态final类,但是我收到错误消息“RowMapper类型不是通用的;它不能用参数参数化”。

我的lib文件夹中所有与Spring相关的jar都是3.1.2.RELEASE版本。我一直无法在其他地方找到任何类似的东西。任何想法为什么会这样?

感谢。

以下是示例代码:

public class OutPatient extends Patient{
     @Pattern(regexp="[0-9]+", message="OPD No. should only contain digits.")
String opdNo;

public String getOpdNo() {
    return opdNo;
}

public void setOpdNo(String opdNo) {
    this.opdNo = opdNo;
}
}

DAO班级:

 @Repository("dbHelper")
 public class DBHelperImpl{
private JdbcTemplate jdbcTemplate;
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

@Autowired
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
    this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}

     public List<OutPatient> fetchOutPatients() {
    String sql = "SELECT  OPDNO as opdNo FROM `test`.`out_patient`";

    @SuppressWarnings("unchecked")  //Have to add this annotation to prevent warning
    List<OutPatient> outPatients = jdbcTemplate.query(sql, new OutPatientRowMapper());
    return outPatients;     

}

     private static final class OutPatientRowMapper implements RowMapper{  //Unable to add <OutPatient> generics here!      
    public OutPatient mapRow(ResultSet rs, int rowNum) throws SQLException {
        OutPatient outPatient = new OutPatient();           
        outPatient.setOpdNo(rs.getString("opdNo"));
                       return outPatient;
              }
     }

6 个答案:

答案 0 :(得分:4)

我有同样的问题,Eclipse警告我RowMapper不是通用的。

所以我手工编写了导入内容:

import org.springframework.jdbc.core.RowMapper;

出现此错误:The import org.springframework.jdbc.core.RowMapper collides with another import statement

所以我查看了我的其他import语句,我在Spring项目中发现了什么:

导入javax.swing.tree.RowMapper;

...我删除了导入,然后一切正常。

答案 1 :(得分:2)

它应该是这样的

List<Bank> list = t.query(sql, args, new RowMapper<Bank>() {
    @Override
    public Bank mapRow(ResultSet rs, int rowNum) throws SQLException {
        Bank t = new Bank();
        t.setName(rs.getString("name"));
        return t;
    }
});

此代码也会在没有警告的情况下编译

   private static final class OutPatientRowMapper implements
            RowMapper<OutPatient> {
        public OutPatient mapRow(ResultSet rs, int rowNum) throws SQLException {
            OutPatient outPatient = new OutPatient();
            outPatient.setOpdNo(rs.getString("opdNo"));
            return outPatient;
        }
    }

答案 2 :(得分:1)

上述答案都不适合我。我拥有所有正确的Maven依赖项;它们只是在pom.xml文件中的顺序错误。在我将订单更改为以下订单后,RowMapper被识别为参数化类。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.3.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.5</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>20030825.184428</version>
    </dependency>
  </dependencies>

答案 3 :(得分:0)

在修补了一点之后,我找到了解决问题的方法。在Tomcat的lib文件夹中有一些旧的弹簧罐(2.0,我猜)。这导致Spring使用旧版本的RowMapper,它不支持参数化。

解决此问题的方法是从构建路径中删除较旧的jar,或者从Order and Export选项卡更改jar的顺序,并将最新的jar带到顶部。

感谢所有回复的人!

答案 4 :(得分:0)

您必须添加这些依赖项

    <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.4.RELEASE</version>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.0.0.RELEASE</version>
</dependency>

答案 5 :(得分:-1)

问题是找不到要获取RowMapper的库。解决方案是添加依赖项。

您必须添加到pom.xml中的那些:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>