[
https://issues.apache.org/jira/browse/WW-4903?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16294803#comment-16294803
]
Lukasz Lenart commented on WW-4903:
-----------------------------------
The simplest workaround is to use the below code to implement your own
{{ActionProxyFactory}}
{code:java}
public class MyPrefixBasedActionProxyFactory extends DefaultActionProxyFactory {
private static final Logger LOG =
LogManager.getLogger(MyPrefixBasedActionProxyFactory.class);
private Map<String, ActionProxyFactory> actionProxyFactories = new
HashMap<>();
@Inject
public void setContainer(Container container) {
this.container = container;
}
@Inject(StrutsConstants.PREFIX_BASED_MAPPER_CONFIGURATION)
public void setPrefixBasedActionProxyFactories(String list) {
if (list != null) {
String[] factories = list.split(",");
for (String factory : factories) {
String[] thisFactory = factory.split(":");
if (thisFactory.length == 2) {
String factoryPrefix = thisFactory[0].trim();
String factoryName = thisFactory[1].trim();
ActionProxyFactory obj =
container.getInstance(ActionProxyFactory.class, factoryName);
if (obj != null) {
actionProxyFactories.put(factoryPrefix, obj);
} else {
LOG.warn("Invalid PrefixBasedActionProxyFactory config
entry: [{}]", factory);
}
}
}
}
}
public ActionProxy createActionProxy(String namespace, String actionName,
String methodName,
Map<String, Object> extraContext,
boolean executeResult, boolean cleanupContext) {
String uri = namespace + (namespace.endsWith("/") ? actionName : "/" +
actionName);
for (int lastIndex = uri.lastIndexOf('/'); lastIndex > (-1); lastIndex
= uri.lastIndexOf('/', lastIndex - 1)) {
String key = uri.substring(0, lastIndex);
ActionProxyFactory actionProxyFactory =
actionProxyFactories.get(key);
if (actionProxyFactory != null) {
LOG.debug("Using ActionProxyFactory [{}] for prefix [{}]",
actionProxyFactory, key);
return actionProxyFactory.createActionProxy(namespace,
actionName, methodName, extraContext, executeResult, cleanupContext);
} else {
LOG.debug("No ActionProxyFactory defined for [{}]", key);
}
}
LOG.debug("Cannot find any matching ActionProxyFactory, falling back to
[{}]", super.getClass().getName());
return super.createActionProxy(namespace, actionName, methodName,
extraContext, executeResult, cleanupContext);
}
}
{code}
then register it in {{struts.xml}}:
{code:xml}
<bean type="com.opensymphony.xwork2.ActionProxyFactory" name="myPrefix"
class="com.company.MyPrefixBasedActionProxyFactory"/>
{code}
and use it in {{struts.xml}}
{code:xml}
<constant name="struts.actionProxyFactory" value="prefix"/>
{code}
> Dependency Mapping Exception When Using PrefixBasedActionProxyFactory
> ---------------------------------------------------------------------
>
> Key: WW-4903
> URL: https://issues.apache.org/jira/browse/WW-4903
> Project: Struts 2
> Issue Type: Bug
> Components: Plugin - REST
> Reporter: aditya shrivastava
> Assignee: Lukasz Lenart
> Fix For: 2.5.15
>
> Attachments: error_screen_shot.png
>
>
> I am using struts-rest plugin with REST & NON REST flow I am using STRUTS
> 2.3.34 version.
> To achieve this I am using following configuration.
> {code:java}
> <constant name="struts.mapper.class"
> value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper"/>
> <constant name="struts.mapper.prefixMapping"
> value="/sm:rest,/pd:rest,:struts"/>
> <constant name="struts.actionProxyFactory" value="prefix"/>
> {code}
> When I start my tomcat & hit on url
> https://localhost:8080/myapp
> I always get the exception
> {code:java}
> HTTP Status 500 – Internal Server Error
> Type Exception Report
> Message java.lang.RuntimeException:
> com.opensymphony.xwork2.inject.DependencyException:
> com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No
> mapping found for dependency
> [type=com.opensymphony.xwork2.ActionProxyFactory,
> name='struts.actionProxyFactory'] in public void
> org.apache.struts2.impl.PrefixBasedActionProxyFactory.setActionProxyFactory(com.opensymphony.xwork2.ActionProxyFactory).
> Description The server encountered an unexpected condition that prevented it
> from fulfilling the request.
> Exception
> java.lang.RuntimeException: java.lang.RuntimeException:
> com.opensymphony.xwork2.inject.DependencyException:
> com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No
> mapping found for dependency
> [type=com.opensymphony.xwork2.ActionProxyFactory,
> name='struts.actionProxyFactory'] in public void
> org.apache.struts2.impl.PrefixBasedActionProxyFactory.setActionProxyFactory(com.opensymphony.xwork2.ActionProxyFactory).
>
> com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:132)
> com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:51)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:514)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:524)
>
> com.opensymphony.xwork2.inject.ContainerImpl$9.call(ContainerImpl.java:555)
>
> com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:584)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:553)
>
> org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:565)
>
> org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
>
> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
>
> com.elitecore.nvsmx.system.filter.PortalSecurityFilter.doFilter(PortalSecurityFilter.java:61)
> Root Cause
> java.lang.RuntimeException:
> com.opensymphony.xwork2.inject.DependencyException:
> com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No
> mapping found for dependency
> [type=com.opensymphony.xwork2.ActionProxyFactory,
> name='struts.actionProxyFactory'] in public void
> org.apache.struts2.impl.PrefixBasedActionProxyFactory.setActionProxyFactory(com.opensymphony.xwork2.ActionProxyFactory).
>
> com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:502)
>
> com.opensymphony.xwork2.inject.ContainerImpl$7.call(ContainerImpl.java:539)
>
> com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:593)
>
> com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:537)
>
> com.opensymphony.xwork2.config.impl.LocatableFactory.create(LocatableFactory.java:32)
>
> com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:130)
> com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:51)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:514)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:524)
>
> com.opensymphony.xwork2.inject.ContainerImpl$9.call(ContainerImpl.java:555)
>
> com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:584)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:553)
>
> org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:565)
>
> org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
>
> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
>
> com.elitecore.nvsmx.system.filter.PortalSecurityFilter.doFilter(PortalSecurityFilter.java:61)
> com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No
> mapping found for dependency
> [type=com.opensymphony.xwork2.ActionProxyFactory,
> name='struts.actionProxyFactory'] in public void
> org.apache.struts2.impl.PrefixBasedActionProxyFactory.setActionProxyFactory(com.opensymphony.xwork2.ActionProxyFactory).
>
> com.opensymphony.xwork2.inject.ContainerImpl.createParameterInjector(ContainerImpl.java:239)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getParametersInjectors(ContainerImpl.java:229)
>
> com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.<init>(ContainerImpl.java:293)
>
> com.opensymphony.xwork2.inject.ContainerImpl$3.create(ContainerImpl.java:117)
>
> com.opensymphony.xwork2.inject.ContainerImpl$3.create(ContainerImpl.java:114)
>
> com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMembers(ContainerImpl.java:141)
>
> com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMethods(ContainerImpl.java:113)
>
> com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:90)
>
> com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:71)
>
> com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:67)
>
> com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:150)
> java.util.concurrent.FutureTask.run(FutureTask.java:266)
>
> com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:76)
>
> com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:116)
>
> com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.<init>(ContainerImpl.java:356)
>
> com.opensymphony.xwork2.inject.ContainerImpl$5.create(ContainerImpl.java:311)
>
> com.opensymphony.xwork2.inject.ContainerImpl$5.create(ContainerImpl.java:307)
>
> com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:150)
> java.util.concurrent.FutureTask.run(FutureTask.java:266)
>
> com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:76)
>
> com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:116)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getConstructor(ContainerImpl.java:607)
>
> com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:498)
>
> com.opensymphony.xwork2.inject.ContainerImpl$7.call(ContainerImpl.java:539)
>
> com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:593)
>
> com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:537)
>
> com.opensymphony.xwork2.config.impl.LocatableFactory.create(LocatableFactory.java:32)
>
> com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:130)
> com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:51)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:514)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:524)
>
> com.opensymphony.xwork2.inject.ContainerImpl$9.call(ContainerImpl.java:555)
>
> com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:584)
>
> com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:553)
>
> org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:565)
>
> org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
>
> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
>
> com.elitecore.nvsmx.system.filter.PortalSecurityFilter.doFilter(PortalSecurityFilter.java:61)
> {code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)