Как использовать вложенный java.reflect.Type в файле свойств пружины - PullRequest
0 голосов
/ 12 февраля 2019

Недавно натолкнулся на случай, когда мне нужны предварительные, но настраиваемые типы (длинная история).Обычно я делаю это

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

Я хотел бы поместить эту правую сторону в мой файл свойств пружины и либо выполнить вызов, подобный следующему:

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

Или использовать @ConfigurationProperties.

Обычно я работаю с @ConfigurationProperties, но в репо, в котором я нахожусь, его нет.Я мог бы сделать так, чтобы зависимости вытягивались, если первый путь просто невозможен, но путь наименьшего сопротивления предпочтителен.

Я пробовал некоторые варианты следующего определения свойства с угловыми скобками, круглыми скобкамии квадратные скобки - ничего не получилось.

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

Мне было трудно получить что-нибудь полезное с типами поисковых терминов, которые вы вынуждены использовать для этой проблемы.Я нашел этот связанный вопрос, но мне не повезло, что я перевел его в не-xml конфигурацию (я не могу также сделать стиль xml в этом проекте).ссылка: Создать конфигурацию Guava TypeToken в Spring xml?

РЕДАКТИРОВАТЬ: Используя ответ, предоставленный @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);

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Рассматривали ли вы использование 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;
0 голосов
/ 12 февраля 2019

Чтобы ответить на ваш пункт «Перевод на 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;
    }
}

Редактировать: я действительно не знаю, поддерживаются ли типы значений, отличные от String, для значений свойств в Spring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...