Struts 2.3: добавление Interceptor во время выполнения

У меня есть задача добавить/изменить время выполнения перехватчиков (с плагином, нет доступа к родительской конфигурации).

В предыдущей версии Struts (2.0) это было довольно просто: классы InterceptorStackConfig и ActionConfig имели методы addInterceptor и addInterceptors.

В более новой версии (2.3) эти методы перемещены в статический подкласс Builder, и я не могу использовать их, как раньше.

Так что это проблема. Уже потратил несколько дней, пытаясь избежать этого. Кто-нибудь может помочь?

Мой предыдущий пример кода:

public class IpLoggingInterceptorConfiguration implements ConfigurationProvider {

private Interceptor interceptor;
private Configuration configuration;

@Override
public void init(Configuration configuration) throws ConfigurationException {
    this.configuration = configuration;
}

@Override
public void loadPackages() throws ConfigurationException {

    for (Object packageConfigName : configuration.getPackageConfigNames()) {
        try {
            String name = (String) packageConfigName;
            PackageConfig packageConfig = configuration.getPackageConfig(name);
            updatePackage(packageConfig);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

public void updatePackage(PackageConfig packageConfig) {
    Map interceptorConfigs = packageConfig.getInterceptorConfigs();

    for (Object stack : interceptorConfigs.keySet()) {

        if (!(interceptorConfigs.get(stack) instanceof InterceptorStackConfig)) continue;

        InterceptorStackConfig interceptorStackConfig = (InterceptorStackConfig) interceptorConfigs.get(stack);

        InterceptorMapping interceptorMapping = new InterceptorMapping("iplogging", getInterceptor());

        List<InterceptorMapping> list = new ArrayList<InterceptorMapping>();
        list.addAll(interceptorStackConfig.getInterceptors());
        interceptorStackConfig.getInterceptors().clear();
        interceptorStackConfig.addInterceptor(interceptorMapping);
        interceptorStackConfig.addInterceptors(list);
    }

    for (String key : packageConfig.getActionConfigs().keySet()) {
        ActionConfig actionConfig = packageConfig.getActionConfigs().get(key);

        InterceptorMapping interceptorMapping = new InterceptorMapping("iplogging", getInterceptor());

        List<InterceptorMapping> list = new ArrayList<InterceptorMapping>();
        list.addAll(actionConfig.getInterceptors());
        actionConfig.getInterceptors().clear();
        actionConfig.addInterceptor(interceptorMapping);
        actionConfig.addInterceptors(list);
    }
}


@Override
public void destroy() {
}

@Override
public boolean needsReload() {
    return false;
}

@Override
public void register(ContainerBuilder arg0, LocatableProperties arg1)
        throws ConfigurationException {
}

public Interceptor getInterceptor() {
    return interceptor;
}

public void setInterceptor(Interceptor interceptor) {
    this.interceptor = interceptor;
}
}

person Likrant    schedule 15.10.2015    source источник
comment
Потому что теперь interceptorStackConfig.getInterceptors() - это UnmodifiableCollection :(   -  person Likrant    schedule 15.10.2015
comment
Что такое минорная версия?   -  person Roman C    schedule 15.10.2015
comment
Я думаю, что эта модификация была связана с новой строкой версий для xwork: mvnrepository.com/ артефакт/org.apache.struts.xwork/xwork-core   -  person Likrant    schedule 15.10.2015
comment
Как вы запускаете свой проект, если у вас нет доступа к родительской конфигурации?   -  person Aleksandr M    schedule 15.10.2015
comment
Я столкнулся с подобной проблемой... и не пришел к приемлемому решению. Я думаю, что вы сможете перестроить всю конфигурацию, но это было похоже на боль. Самый простой способ — создать новый перехватчик, который позволит вам динамически добавлять дополнительные перехватчики (перехватчик ChainOfResponsibility, который вы можете динамически добавлять в этот стек перехватчиков).   -  person Quaternion    schedule 15.10.2015
comment
Не особо задумывался о том, что вы на самом деле пытаетесь сделать, вы знаете, что можете изучить Spring AOP. Если вы хотите ведение журнала на уровне приложения, это в значительной степени определение сквозной проблемы, и поэтому это канонический пример, используемый для АОП.   -  person Quaternion    schedule 16.10.2015


Ответы (1)


Я нашел и знаю, это решение уродливое, но простое и работает... Может быть, у кого-то есть лучше.

try {
            Field interceptorsListField=InterceptorStackConfig.class.getDeclaredField("interceptors");
            interceptorsListField.setAccessible(true);
            List<InterceptorMapping> interceptorsList= (List<InterceptorMapping>) interceptorsListField.get(interceptorStackConfig);

            List<InterceptorMapping> list = new ArrayList<>();
            list.add(interceptorMapping);
            list.addAll(interceptorStackConfig.getInterceptors());
            interceptorsListField.set(interceptorStackConfig,list);
        } catch (Exception e) {
            e.printStackTrace();
        }
person Likrant    schedule 23.10.2015