Spring application selects incorrect AOP proxy for beanListing Aspect-proxied beans in SpringHow does Spring config file validate against the Spring beans XSD?Spring Beans Schema no longer available on the Web?Issue with adding multiple connection factories to spring social with spring 3.0.3Could not commit Hibernate transaction; nested exception is org.hibernate.Transaction Exception: JDBC commit failedunable to integrate spring security in existing applicationSpring MVC: Controller RequestMapping working, but return always gives a 404IntelliJ + Spring Web MVCSpring hibernate integration - org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is definedHow to include properties from external file to hibernate.cfg.xml using spring in a standalone app(jar)Spring.xml error config
Will greasing clutch parts make it softer
How can I get a file's size with C++17?
"Best practices" for formulating MIPs
What is -(-2,3,4)?
My players like to search everything. What do they find?
Which high-degree derivatives play an essential role?
What caused the flashes in the video footage of Chernobyl?
How is /a/ pronounced before n/m in French?
What does the ash content of broken wheat really mean?
Versicle and response symbols
Can I deep fry food in butter instead of vegetable oil?
Can Monks cast spells?
Are there advantages in writing by hand over typing out a story?
Does this circuit have marginal voltage level problem?
Was Wolfgang Unzicker the last Amateur GM?
Does a reference have a storage location?
Phrasing "it says" or "it reads"
What instances can be solved today by modern solvers (pure LP)?
What verb goes with "coup"?
List of Implementations for common OR problems
Performance of loop vs expansion
What is a "tittering order"?
What do you call the motor that fuels the movement of a robotic arm?
Recolour existing plots
Spring application selects incorrect AOP proxy for bean
Listing Aspect-proxied beans in SpringHow does Spring config file validate against the Spring beans XSD?Spring Beans Schema no longer available on the Web?Issue with adding multiple connection factories to spring social with spring 3.0.3Could not commit Hibernate transaction; nested exception is org.hibernate.Transaction Exception: JDBC commit failedunable to integrate spring security in existing applicationSpring MVC: Controller RequestMapping working, but return always gives a 404IntelliJ + Spring Web MVCSpring hibernate integration - org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is definedHow to include properties from external file to hibernate.cfg.xml using spring in a standalone app(jar)Spring.xml error config
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I have a Spring Webflow application that has an on-start entry that sets up a number of context variables related to the current user of the application - their ID, their application role, etc. One of the on-start method invocations fails, throwing the following error
org.springframework.expression.spel.SpelEvaluationExpression EL1004E: Method call userisAuthorized(java.lang.String,null) cannot be found on com.sun.proxy.$Proxy61 type
org.springframework.webflow.execution ActionExecutionException: Exception thrown executing [AnnotatedAction@18864e3f targetAction = [EvaluateAction@197b16ad expression = userService.userisAuthorized(flowScope.UserUid, flowScope.isRoleBased), resultExpression = flowScope.userAuthorized, attributes = map[[empty]]] in state 'null' of flow 'requestAccess' -- action execution attributes were 'map[[empty]]'
The real problem however is this: the app actually does in fact successfully call the userisAuthorized method on the userService bean for all except one particular user.
Doing some dynamic debugging and referencing this helpful SO post Listing Aspect-proxied beans in Spring I've been able to determine that the auto wiring does in fact find the userService. But it's loaded into the application context as com.sun.proxy.$Proxy63, not $Proxy61.
Since the error seems related to the user logged in at the time of the call, I'm guessing there might be some other proxy injected into the context prior to the actual userService, perhaps related to Spring security config, that Spring is for some reason getting confused with the actual proxy for the userService bean. But I can't for the life of me figure out why that would happen - there simply is no other class anywhere in the app that has a isuserAuthorized method and in any case the Spring security config is not scanning the service package anyway.
security config
<?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>
.
.
.
the service bean interface
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);
.
.
.
the service bean implementation w/annotations
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
.
spring proxy aop
add a comment |
I have a Spring Webflow application that has an on-start entry that sets up a number of context variables related to the current user of the application - their ID, their application role, etc. One of the on-start method invocations fails, throwing the following error
org.springframework.expression.spel.SpelEvaluationExpression EL1004E: Method call userisAuthorized(java.lang.String,null) cannot be found on com.sun.proxy.$Proxy61 type
org.springframework.webflow.execution ActionExecutionException: Exception thrown executing [AnnotatedAction@18864e3f targetAction = [EvaluateAction@197b16ad expression = userService.userisAuthorized(flowScope.UserUid, flowScope.isRoleBased), resultExpression = flowScope.userAuthorized, attributes = map[[empty]]] in state 'null' of flow 'requestAccess' -- action execution attributes were 'map[[empty]]'
The real problem however is this: the app actually does in fact successfully call the userisAuthorized method on the userService bean for all except one particular user.
Doing some dynamic debugging and referencing this helpful SO post Listing Aspect-proxied beans in Spring I've been able to determine that the auto wiring does in fact find the userService. But it's loaded into the application context as com.sun.proxy.$Proxy63, not $Proxy61.
Since the error seems related to the user logged in at the time of the call, I'm guessing there might be some other proxy injected into the context prior to the actual userService, perhaps related to Spring security config, that Spring is for some reason getting confused with the actual proxy for the userService bean. But I can't for the life of me figure out why that would happen - there simply is no other class anywhere in the app that has a isuserAuthorized method and in any case the Spring security config is not scanning the service package anyway.
security config
<?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>
.
.
.
the service bean interface
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);
.
.
.
the service bean implementation w/annotations
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
.
spring proxy aop
add a comment |
I have a Spring Webflow application that has an on-start entry that sets up a number of context variables related to the current user of the application - their ID, their application role, etc. One of the on-start method invocations fails, throwing the following error
org.springframework.expression.spel.SpelEvaluationExpression EL1004E: Method call userisAuthorized(java.lang.String,null) cannot be found on com.sun.proxy.$Proxy61 type
org.springframework.webflow.execution ActionExecutionException: Exception thrown executing [AnnotatedAction@18864e3f targetAction = [EvaluateAction@197b16ad expression = userService.userisAuthorized(flowScope.UserUid, flowScope.isRoleBased), resultExpression = flowScope.userAuthorized, attributes = map[[empty]]] in state 'null' of flow 'requestAccess' -- action execution attributes were 'map[[empty]]'
The real problem however is this: the app actually does in fact successfully call the userisAuthorized method on the userService bean for all except one particular user.
Doing some dynamic debugging and referencing this helpful SO post Listing Aspect-proxied beans in Spring I've been able to determine that the auto wiring does in fact find the userService. But it's loaded into the application context as com.sun.proxy.$Proxy63, not $Proxy61.
Since the error seems related to the user logged in at the time of the call, I'm guessing there might be some other proxy injected into the context prior to the actual userService, perhaps related to Spring security config, that Spring is for some reason getting confused with the actual proxy for the userService bean. But I can't for the life of me figure out why that would happen - there simply is no other class anywhere in the app that has a isuserAuthorized method and in any case the Spring security config is not scanning the service package anyway.
security config
<?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>
.
.
.
the service bean interface
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);
.
.
.
the service bean implementation w/annotations
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
.
spring proxy aop
I have a Spring Webflow application that has an on-start entry that sets up a number of context variables related to the current user of the application - their ID, their application role, etc. One of the on-start method invocations fails, throwing the following error
org.springframework.expression.spel.SpelEvaluationExpression EL1004E: Method call userisAuthorized(java.lang.String,null) cannot be found on com.sun.proxy.$Proxy61 type
org.springframework.webflow.execution ActionExecutionException: Exception thrown executing [AnnotatedAction@18864e3f targetAction = [EvaluateAction@197b16ad expression = userService.userisAuthorized(flowScope.UserUid, flowScope.isRoleBased), resultExpression = flowScope.userAuthorized, attributes = map[[empty]]] in state 'null' of flow 'requestAccess' -- action execution attributes were 'map[[empty]]'
The real problem however is this: the app actually does in fact successfully call the userisAuthorized method on the userService bean for all except one particular user.
Doing some dynamic debugging and referencing this helpful SO post Listing Aspect-proxied beans in Spring I've been able to determine that the auto wiring does in fact find the userService. But it's loaded into the application context as com.sun.proxy.$Proxy63, not $Proxy61.
Since the error seems related to the user logged in at the time of the call, I'm guessing there might be some other proxy injected into the context prior to the actual userService, perhaps related to Spring security config, that Spring is for some reason getting confused with the actual proxy for the userService bean. But I can't for the life of me figure out why that would happen - there simply is no other class anywhere in the app that has a isuserAuthorized method and in any case the Spring security config is not scanning the service package anyway.
security config
<?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>
.
.
.
the service bean interface
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);
.
.
.
the service bean implementation w/annotations
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
.
spring proxy aop
spring proxy aop
asked Mar 25 at 18:13
SCornellSCornell
205 bronze badges
205 bronze badges
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55344131%2fspring-application-selects-incorrect-aop-proxy-for-bean%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Is this question similar to what you get asked at work? Learn more about asking and sharing private information with your coworkers using Stack Overflow for Teams.
Is this question similar to what you get asked at work? Learn more about asking and sharing private information with your coworkers using Stack Overflow for Teams.
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55344131%2fspring-application-selects-incorrect-aop-proxy-for-bean%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown