0

最近遇到一个案例,我想要预先但可配置的类型(长篇大论)。通常我会这样做

Type t = new TypeToken<ArrayList<Integer>>() {}.getType();

我想把右手边放到我的 spring 属性文件中,然后发出类似这样的调用:

Type t = env.getProperty("type-property");

或者使用@ConfigurationProperties。

我通常使用@ConfigurationProperties,但我所在的存储库没有它可用。如果第一种方法根本不可能,我可以提出引入依赖关系的案例,但阻力最小的路径是可取的。

我用尖括号、括号和方括号尝试了以下属性定义的一些变体——没有一个成功。

type-property=java.util.ArrayList<java.lang.Integer>

对于您在此问题上被迫使用的各种搜索字词,我很难获得任何有用的信息。我找到了这个相关的问题,但没有运气将它翻译成非 xml 配置(我也不能在这个项目中做 xml 样式)。链接:在 Spring xml 配置中创建 Guava TypeToken?

编辑:使用@LppEdd 提供的答案,我使用以下调用进行反序列化:

Type sampleType = new TypeToken<HashSet<ArrayList<Integer>>>() {}.getType();
// serialize via java.lang.reflect.Type.getTypeName()
String serializedType = sampleType.getTypeName();
// above string value is "java.util.HashSet<java.util.ArrayList<java.lang.Integer>>"
// deserialize via org.eclipse.jetty.util.TypeUtil.fromName(String name)
Type sampleTypeAgain = TypeUtil.fromName(serializedType);
4

2 回答 2

0

要回答您的“翻译成 Java”的观点:

@Bean
@Qualifier("IntegerArrayList")
public Type integerArrayList() {
   return new TypeToken<ArrayList<Integer>>() {}.getType();
}

用法:

@Autowired
@Qualifier("IntegerArrayList")
private Type type;

或者...

我会让你从这里开始。
“更好”的方法是使用@ConfigurationProperties自定义PropertySource实现。所有Type子类都应该是可序列化的,因此您可以存储序列化数据并即时反序列化。

显然,字段的名称将对应于Type(s) 映射键。

class TypePropertySource extends PropertySource<TypeSource> {
    private final TypeSource source;

    TypePropertySource(final TypeSource source) {
        super("a-name", source);
        this.source = source;
    }

    @Override
    public Object getProperty(final String name) {
        try {
            return (Type) source.getAndDeserialize(name);
        } catch (final Exception e) {
            // Recover or do nothing.
        }

        return null;
    }
}

编辑:我真的不知道StringSpring 中的属性值是否支持其他类型。

于 2019-02-11T21:41:35.353 回答
0

您是否考虑过使用 Spring SPEL?它几乎为您完成了解决方案,除非由于对泛型的支持不好,您需要为TypeToken.

例如,具体类:

import java.util.ArrayList;
import com.google.common.reflect.TypeToken;

public class MyType extends TypeToken< ArrayList<Integer> >{

}

你可以拥有这样的财产:

type-property: new com.comcast.viser.ipPreference.web.MyType().getType()

并像这样注入它:

@Value("#{${type-property}}")
private java.lang.reflect.Type type;
于 2019-02-11T22:17:30.413 回答