Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring将csv转换为数组,但不转换为列表_Java_Spring_Spring Boot - Fatal编程技术网

Java Spring将csv转换为数组,但不转换为列表

Java Spring将csv转换为数组,但不转换为列表,java,spring,spring-boot,Java,Spring,Spring Boot,我在POJO中有一个声明,看起来像这样: @Value("${prefix.someList}") private List<String> list; prefix.list = some,stuff,with,comma,separators 我还向POJO添加了一个@PostConstruct方法,只是为了添加一行设置断点 当我点击断点时,我查看“list”属性,它有一个值为“some,stuff,with,comma,separators”的条目 我还补充了以下声明:

我在POJO中有一个声明,看起来像这样:

@Value("${prefix.someList}")
private List<String> list;
prefix.list   = some,stuff,with,comma,separators
我还向POJO添加了一个
@PostConstruct
方法,只是为了添加一行设置断点

当我点击断点时,我查看“list”属性,它有一个值为“
some,stuff,with,comma,separators
”的条目

我还补充了以下声明:

@Value("${prefix.someList}")
private String[] array;
在断点处,数组有5个条目,都是预期值

如果我将第一个表达式转换为

"#{'${prefix.list}'.split(',')}"
然后它会生成一个包含预期条目的列表,但我不希望这样做。它稍微复杂一点,不能防御空列表属性

然后我用谷歌搜索了一下这个问题。我看到一些建议,建议我应该添加一个“
ConversionService
”bean,用“
newdefaultconversionservice()
”实例化。是我干的。我还发现了“
StringToCollectionConverter
”和“
StringToArrayConverter
”的引用。我在这些类中的预期位置设置断点

我发现正在创建
DefaultConversionService
,以及两个转换器类。然而,这些类中的“convert”方法从未被调用过,即使是“array”方法,即使某些东西正在进行转换

然后我甚至注释掉了创建
DefaultConversionService
的Bean,我发现结果是相同的(我注意到构造函数被击中了两次)

因此,简而言之,字符串到列表的转换没有发生,即使字符串到数组是,但我不知道应该用什么机制来实现,因为两个预期的转换器似乎都没有被使用,即使数组转换正在某处进行

我将Spring5.0.9与Java8一起使用

要明确的是,另一个据称与此重复的帖子没有帮助。首先,“答案”只是一个不太理想的解决办法,其实不必要。那篇文章中的另一个建议没有任何区别

更新

有人建议我应该构建一个最小的可复制示例。幸运的是,start.spring.io使生成spring引导框架变得简单(我之前没有提到这是一个spring引导应用程序)

我采用了maven和java8项目的示例。请注意,我选择了版本2.1.0,但我自己的项目使用的是2.0.5

我添加了一个伪类,添加了一个@Component注释,添加了一个list和array属性,一个打印列表和列表长度的@PostConstruct方法,并在application.properties中定义了一个csv列表属性

我跑了。它照你说的做了。它工作得很好,生成了一个包含csv列表中相同数量元素的列表。然而,令人好奇的是,它似乎仍然没有调用转换服务中的转换器。转换器类中的断点均未命中

然后,我将pom中的spring引导版本从2.1.0更改为2.0.5,并重新运行测试。繁荣我的行为和我看到的一模一样。它生成了一个包含一个元素的列表,其中字符串是整个csv列表

因此,似乎在2.0.5和2.1.0之间进行了一些更改或修复,使其正常工作

我现在无法升级,因此无法使用此解决方案。我会搜索spring引导更改日志,但由于我从未看到它达到预期的转换器类,我想知道到底是什么在这样做

更新

如果重要的话,下面是我添加到springboot框架中的简单pojo:

package com.example.demo;

import java.util.List;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Stuff {
    @Value("${stuffList}")
    private List<String>    stuffList;
    @Value("${stuffList}")
    private String[]    stuffArray;

    public final List<String> getStuffList() { return stuffList; }

    public final void setStuffList(List<String> stuffList) { this.stuffList = stuffList; }

    public final String[] getStuffArray() { return stuffArray; }

    public final void setStuffArray(String[] stuffArray) { this.stuffArray = stuffArray; }

    @PostConstruct
    public void stuff() {
        System.out.println("stuffList[" + stuffList + "] len[" + stuffList.size() + "]");
    }
}
更新

好的,在中描述了解决方案,但这不是公认的答案。正确答案是描述使用DefaultConversionService类型的对象定义ConversionService类型的bean


可能令人困惑的是,如果在添加该bean之前在DefaultConversionService中设置了一些断点,则会命中它们。然而,Spring似乎在默认情况下将该类用于除属性值解析之外的其他事情。一旦我添加了bean(我在正确的类中添加了它),StringToCollection转换器就可以正常工作。

可能的副本对我来说很有用。如果不是的话,请提供一个。我也看到了你们两个的帖子。在我的帖子中,我展示了我已经尝试了被接受的答案,以及其他看起来更合适的答案。我已经指出,它提供的被接受的答案是次优的,因为它更加冗长,似乎不必要。另一个建议没有任何区别(因为它已经实例化了那个bean)。我想你一定是做错了什么。请提供答案。这是否回答了您的问题?使用#strings.arraySplit
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}