0

我有一个 Spring Batch 作业设置为读取 CSV。

在阅读器中,它使用 FlatFileReader 创建代表每一行的 ProductCSV 对象。

然后在编写器中,它将每一行转换为一个实际的 Object 对象,该对象使用 hibernate 映射到使用扩展 ItemWriter 的数据库中。

效果很好我唯一的问题是 ENUM 类型的字段。我得到的错误是:

字段“类别”上的对象“目标”中的字段错误:拒绝值 [某些类别];代码 [typeMismatch.target.category,typeMismatch.category,typeMismatch.com.project.enums.ProductCategory,typeMismatch]; 参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [target.category,category]; 论据 []; 默认消息[类别]];默认消息 [无法将类型“java.lang.String”的属性值转换为属性“类别”所需的类型“com.project.enums.ProductCategory”;嵌套异常是 java.lang.IllegalStateException:无法将类型 [java.lang.String] 的值转换为属性“类别”所需的类型 [com.project.ProductCategory]:找不到匹配的编辑器或转换策略]

这是 ENUM 的样子:

package com.project.enums;

public enum ProductCategory
{
    SomeCategory( "Some Category" ),
    AnotherCategory( "Another Category" );

    final String display;

    private ProductCategory( String display )
    {
        this.display = display;
    }

    @Override
    public String toString()
    {
        return display;
    }
}

下面是 ProductCSV 对象的样子:

package com.project.LoadSavingInfo;

import com.project.enums.ProductCategory;

public class ProductCSV
{
    private ProductCategory category;

    public ProductCategory getCategory()
    {
        return this.category;
    }

    public void setCategory( ProductCategory category )
    {
        this.category = category;
    }
}

这是实际对象的样子:

package com.project;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Table;

import com.project.enums.ProductCategory;

@Entity
@Table( name = "product" )
public class Product
{
    @Column( nullable = false )
    @Enumerated(EnumType.STRING)
    private ProductCategory category;

    public ProductCategory getCategory()
    {
        return category;
    }

    public void setCategory( ProductCategory category )
    {
        this.category = category;
    }
}

因此,当它从 CSV 中读取“某些类别”之类的内容时,如何将其转换为 ENUM 类型?非常感谢任何帮助或建议,如果您需要更多信息,请询问。

4

1 回答 1

0

问题是标准 Spring text->enum 转换是使用枚举的名称 ( SomeCategory, AnotherCategory) 而不是他的displayName.
我的建议是将枚举的显示名称转换为您的 ProductCategory 对象ItemProcessor

class MyItemProcessor<ProductCSV,Product> {
  public Product process(ProductCSV item) {
    Product p = new Product();

    p.setCategory(ProductCategory.fromDisplayName(item.getCategory());
  }
}

作为副作用,您必须声明

public class ProductCSV {
    private String category;
    public String getCategory() {
        return this.category;
    }
    public void setCategory( String category ) {
        this.category = category;
    }
}

您掌握了完整的过程(这是我的首选方式,更清洁)。

另一种解决方案是使用您当前的类并编写自定义枚举属性编辑器/转换,如Spring custom converter for all Enums中所述。

于 2013-09-20T13:00:41.263 回答