У меня есть приложение Spring Webflow, в котором есть запись при запуске, которая устанавливает ряд переменных контекста, связанных с текущим пользователем приложения, - их идентификатор, роль приложения и т. Д. Один из вызовов метода при запуске не удается, выбрасывая следующую ошибку
org.springframework.expression.spel.SpelEvaluationExpression EL1004E: вызов метода userisAuthorized (java.lang.String, null) не найден в com.sun.proxy. Тип $ Proxy61
org.springframework.webflow.execution ActionExecutionException: исключение, выбрасываемое при выполнении [AnnotatedAction @ 18864e3f targetAction = [EvaluateAction @ 197b16ad expression = userService.userisAuthorized (flowScope.UserUid, attributeScope.ishorException.AmpScope_ServiceScope_ServiceScope_ServiceScope_AsserviceScope.Scope_ServiceScope_Scope_ServiceScope.Severse_ServiceScope =юсервид) [пусто]]] в состоянии 'null' потока 'requestAccess' - атрибуты выполнения действия были 'map [[empty]]'
Однако реальная проблема заключается в следующем: приложение фактически успешно вызывает метод userisAuthorized для bean-компонента userService для всех, кроме одного конкретного пользователя.
Выполнение некоторой динамической отладки и ссылки на этот полезный пост SO Перечисление компонентов с проксированием в Spring Я смог определить, что автоматическое подключение действительно находит userService. Но он загружается в контекст приложения как com.sun.proxy. $ Proxy6 3 , а не $ Proxy6 1 .
Поскольку ошибка, по-видимому, связана с тем, что пользователь вошел в систему во время вызова, я полагаю, что в контекст может быть добавлен какой-то другой прокси-сервер до фактического userService, возможно, связанный с конфигурацией безопасности Spring, что Spring является по какой-то причине путают с фактическим прокси для bean-компонента userService. Но я не могу понять, почему это произойдет - в приложении просто нет другого класса, в котором есть метод isuserAuthorized, и в любом случае конфигурация безопасности Spring в любом случае не сканирует пакет службы.
настройка безопасности
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- Enable auto-wiring -->
<context:annotation-config/>
<!-- Scan for auto-wiring classes in spring saml packages --> <=== package that have security proxies do NOT include service
<context:component-scan base-package="org.trinityhealth.sarequest.security"/>
<context:component-scan base-package="org.trinityhealth.sarequest.dao" />
<context:component-scan base-package="org.trinityhealth.sarequest.model" />
webflow config
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
<on-start>
<evaluate expression="systemAccessService.populateUserInformation(flowScope.accessRequest)" />
<evaluate expression="externalContext.globalSessionMap.userUid" result="flowScope.userUid"/>
<evaluate expression="externalContext.globalSessionMap.isRoleBased" result="flowScope.isRoleBased"/>
<evaluate expression="externalContext.globalSessionMap.userRhmId" result="flowScope.userRhmId"/>
<evaluate expression="userService.userisAuthorized(flowScope.userUid, flowScope.isRoleBased)" result="flowScope.userAuthorized"/> <=== the failing method call
<evaluate expression="userService.readRoleFromSecurityContext()" result="flowScope.loggedInUserRole"/>
<set name="conversationScope.hideSteps" value="'N'" />
</on-start>
.
.
.
интерфейс служебного компонента
package org.trinityhealth.sarequest.service; <=== not in security, dao, or model package
.
. various import statements
.
public interface UserService {
.
. bunch of method definitions, none named userisAuthorized or having a (String,char) signature
.
public boolean userisAuthorized(String thisUserId, char isRoleBased);
}
.
.
.
реализация компонента службы с аннотациями
package org.trinityhealth.sarequest.service; <=== not in security, dao, or model package
.
. various import statements
.
@Service("userService")
public class UserServiceImpl implements UserService {
.
. bunch of implemented Methods, none named userisAuthorized or having a (String,char) signature
.
@Override
@Transactional
public boolean userisAuthorized(String thisUserId, char isRoleBased) {
.
. implementation of userisAuthorized, which works if on-start expresssion selects correct bean
.
}
}