You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Dave Newton (JIRA)" <ji...@apache.org> on 2012/10/15 23:11:03 UTC
[jira] [Updated] (WW-3898) Redirect Action calls wrong method
[ https://issues.apache.org/jira/browse/WW-3898?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Dave Newton updated WW-3898:
----------------------------
Description:
I call an action and expect to be redirected to another action BUT instead I get java.lang.NoSuchMethodException. In my example Spring is in charge of constructing my Action object and I have a naive object that returns a random String. It turns out that this random string is being somehow mistaken by the action name, so I get something like java.lang.NoSuchMethodException: test.action.Test.TSldxhPcLq().
I've made a simple project that is very simple to test.
In the following example you can call "redirect" action and see the bug. I have a small zip with this test project but I'm not finding any upload button.
Here is my config
struts.xml
{code:xml}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<constant name="struts.devMode" value="false" />
<!-- Prevents struts from appending .action ... use a comma for empty suffix -->
<constant name="struts.action.extension" value="," />
<package name="general" extends="struts-default">
<action name="test" method="test"
class="test.action.Test">
<result name="success">/jsp/test.jsp</result>
</action>
<action name="redirect" method="redirect"
class="test.action.Redirect">
<result type="redirectAction">test</result>
</action>
</package>
</struts>
{code}
ApplicationContext.xml
{code:xml}
<?xml version="1.0" encoding="UTF-8"?>
<!-- Developer -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="testRandomKey" class="test.utils.RandomString" factory-method="createRandomString" lazy-init="false">
<constructor-arg>
<value type="java.lang.Integer">10</value>
</constructor-arg>
</bean>
</beans>
{code}
Test.java
{code:java}
public class Test {
public String test(){
return ActionSupport.SUCCESS;
}
}
{code}
Redirect.java
{code:java}
public class Redirect {
public String redirect(){
return ActionSupport.SUCCESS;
}
}
{code}
RandomString.java
{code:java}
public class RandomString {
public RandomString() {
}
public static char createChar(int temp) {
return (char) temp;
}
public static int createInt(char temp) {
return (int) temp;
}
public static void createAsciiTable() {
for (int z = 0; z < 256; z++) {
char[] test3;
test3 = new char[1];
test3[0] = RandomString.createChar(z);
String test2 = new String(test3);
byte[] t3;
t3 = test2.getBytes();
int a2 = t3[0];
int a3 = (a2 & 0x7F) + (a2 < 0 ? 128 : 0);
System.out.println("mitChar: " + RandomString.createChar(z) + " "
+ RandomString.createInt(RandomString.createChar(z))
+ " mitString: " + test2 + " " + a3);
}
}
public static char createRandomChar() {
int temp = new Random().nextInt(256); // limitation of Ascii Char 33 to
// 255
if ((temp < 48) || (temp > 47 && temp < 65) || (temp > 90 && temp < 97)
|| (temp > 122))
{
temp = createRandomChar();
return (char) temp;
}
else {
// System.out.println(temp);
return (char) temp;
}
}
public static String createRandomString(int length) {
StringBuffer sb = new StringBuffer();
for (int j = 0; j < length; j++) {
sb.append(createRandomChar());
}
return sb.toString();
}
}
{code}
was:
I call an action and expect to be redirected to another action BUT instead I get java.lang.NoSuchMethodException. In my example Spring is in charge of constructing my Action object and I have a naive object that returns a random String. It turns out that this random string is being somehow mistaken by the action name, so I get something like java.lang.NoSuchMethodException: test.action.Test.TSldxhPcLq().
I've made a simple project that is very simple to test.
In the following example you can call "redirect" action and see the bug. I have a small zip with this test project but I'm not finding any upload button.
Here is my config
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<constant name="struts.devMode" value="false" />
<!-- Prevents struts from appending .action ... use a comma for empty suffix -->
<constant name="struts.action.extension" value="," />
<package name="general" extends="struts-default">
<action name="test" method="test"
class="test.action.Test">
<result name="success">/jsp/test.jsp</result>
</action>
<action name="redirect" method="redirect"
class="test.action.Redirect">
<result type="redirectAction">test</result>
</action>
</package>
</struts>
ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Developer -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="testRandomKey" class="test.utils.RandomString" factory-method="createRandomString" lazy-init="false">
<constructor-arg>
<value type="java.lang.Integer">10</value>
</constructor-arg>
</bean>
</beans>
Test.java
public class Test {
public String test(){
return ActionSupport.SUCCESS;
}
}
Redirect.java
public class Redirect {
public String redirect(){
return ActionSupport.SUCCESS;
}
}
RandomString.java
public class RandomString {
public RandomString() {
}
public static char createChar(int temp) {
return (char) temp;
}
public static int createInt(char temp) {
return (int) temp;
}
public static void createAsciiTable() {
for (int z = 0; z < 256; z++) {
char[] test3;
test3 = new char[1];
test3[0] = RandomString.createChar(z);
String test2 = new String(test3);
byte[] t3;
t3 = test2.getBytes();
int a2 = t3[0];
int a3 = (a2 & 0x7F) + (a2 < 0 ? 128 : 0);
System.out.println("mitChar: " + RandomString.createChar(z) + " "
+ RandomString.createInt(RandomString.createChar(z))
+ " mitString: " + test2 + " " + a3);
}
}
public static char createRandomChar() {
int temp = new Random().nextInt(256); // limitation of Ascii Char 33 to
// 255
if ((temp < 48) || (temp > 47 && temp < 65) || (temp > 90 && temp < 97)
|| (temp > 122))
{
temp = createRandomChar();
return (char) temp;
}
else {
// System.out.println(temp);
return (char) temp;
}
}
public static String createRandomString(int length) {
StringBuffer sb = new StringBuffer();
for (int j = 0; j < length; j++) {
sb.append(createRandomChar());
}
return sb.toString();
}
}
> Redirect Action calls wrong method
> ----------------------------------
>
> Key: WW-3898
> URL: https://issues.apache.org/jira/browse/WW-3898
> Project: Struts 2
> Issue Type: Bug
> Components: Plugin - Spring
> Affects Versions: 2.3.4, 2.3.4.1
> Environment: Mac OS X Lion 10.7.4
> java version "1.6.0_35"
> Java(TM) SE Runtime Environment (build 1.6.0_35-b10-428-11M3811)
> Java HotSpot(TM) 64-Bit Server VM (build 20.10-b01-428, mixed mode)
> Reporter: Javier Lecuona
> Labels: Bug, Spring
>
> I call an action and expect to be redirected to another action BUT instead I get java.lang.NoSuchMethodException. In my example Spring is in charge of constructing my Action object and I have a naive object that returns a random String. It turns out that this random string is being somehow mistaken by the action name, so I get something like java.lang.NoSuchMethodException: test.action.Test.TSldxhPcLq().
> I've made a simple project that is very simple to test.
> In the following example you can call "redirect" action and see the bug. I have a small zip with this test project but I'm not finding any upload button.
> Here is my config
> struts.xml
> {code:xml}
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE struts PUBLIC
> "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
> "http://struts.apache.org/dtds/struts-2.1.7.dtd">
> <struts>
> <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
> <constant name="struts.devMode" value="false" />
> <!-- Prevents struts from appending .action ... use a comma for empty suffix -->
> <constant name="struts.action.extension" value="," />
> <package name="general" extends="struts-default">
> <action name="test" method="test"
> class="test.action.Test">
> <result name="success">/jsp/test.jsp</result>
> </action>
>
> <action name="redirect" method="redirect"
> class="test.action.Redirect">
> <result type="redirectAction">test</result>
> </action>
>
> </package>
> </struts>
> {code}
> ApplicationContext.xml
> {code:xml}
> <?xml version="1.0" encoding="UTF-8"?>
> <!-- Developer -->
> <beans xmlns="http://www.springframework.org/schema/beans"
> xmlns:security="http://www.springframework.org/schema/security"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
> xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
> xsi:schemaLocation="
> http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
> <bean id="testRandomKey" class="test.utils.RandomString" factory-method="createRandomString" lazy-init="false">
> <constructor-arg>
> <value type="java.lang.Integer">10</value>
> </constructor-arg>
> </bean>
> </beans>
> {code}
> Test.java
> {code:java}
> public class Test {
>
> public String test(){
> return ActionSupport.SUCCESS;
> }
> }
> {code}
> Redirect.java
> {code:java}
> public class Redirect {
>
> public String redirect(){
> return ActionSupport.SUCCESS;
> }
> }
> {code}
> RandomString.java
> {code:java}
> public class RandomString {
> public RandomString() {
> }
> public static char createChar(int temp) {
> return (char) temp;
> }
> public static int createInt(char temp) {
> return (int) temp;
> }
> public static void createAsciiTable() {
> for (int z = 0; z < 256; z++) {
> char[] test3;
> test3 = new char[1];
> test3[0] = RandomString.createChar(z);
> String test2 = new String(test3);
> byte[] t3;
> t3 = test2.getBytes();
> int a2 = t3[0];
> int a3 = (a2 & 0x7F) + (a2 < 0 ? 128 : 0);
> System.out.println("mitChar: " + RandomString.createChar(z) + " "
> + RandomString.createInt(RandomString.createChar(z))
> + " mitString: " + test2 + " " + a3);
> }
> }
> public static char createRandomChar() {
> int temp = new Random().nextInt(256); // limitation of Ascii Char 33 to
> // 255
> if ((temp < 48) || (temp > 47 && temp < 65) || (temp > 90 && temp < 97)
> || (temp > 122))
> {
> temp = createRandomChar();
> return (char) temp;
> }
> else {
> // System.out.println(temp);
> return (char) temp;
> }
> }
> public static String createRandomString(int length) {
> StringBuffer sb = new StringBuffer();
> for (int j = 0; j < length; j++) {
> sb.append(createRandomChar());
> }
> return sb.toString();
> }
> }
> {code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira