Just in case anyone can benefit from the insight, it turned out to be a configuration option and unfortunately that property isn't mentioned in the default properties file. (perhaps it could be added?)

In spite of configuring the struts properties for spring like below (properties as found in the default struts properties file)
struts.objectFactory=spring
struts.objectFactory.spring.autoWire=name
struts.objectFactory.spring.useClassCache=true

It turns out that even when configured in this way the StrutsSpringObjectFactory doesn't enforce it and can still load by type (only if there is a single bean of the relevant type as per behaviour of autowire by type) when trying to resolve constructors unless the following property is also set..

#This must be set to true when autowiring by name to prevent the StrutsSpringObjectFactory autowiring by type!
struts.objectFactory.spring.autoWire.alwaysRespect=true

Problem solved, cheers,
M.

On 09/05/2011 17:29, Andrew Lee wrote:
Ok, I didn't see you aren't actually referencing the string bean in your
action. That won't help
On 9 May 2011 17:23, "Andrew Lee"<plasma...@gmail.com>  wrote:
He's not using it as a java bean. Spring beans can be immutable.

Is it because when spring wires up your action it considers it to be a
parameter as you have get and set methods? So it appends it to the url. If
you inject t string bean via constructor injection and not via setter
injection and remove the getters and setters ,does that work?
On 9 May 2011 16:54, "Chris Pratt"<thechrispr...@gmail.com>  wrote:
Even if Spring considers it valid, that doesn't mean that other packages
will be able to treat immutable, non-JavaBeans as JavaBeans.
(*Chris*)

On Mon, May 9, 2011 at 3:39 AM, Marcus<mar...@marcusbond.co.uk>  wrote:

You can if you want to use a String as a Spring bean, it's a different
issue as to whether or not it is considered best practice or whether
there
are alternatives. You can find examples on the SpringSource forum if you
want, commented upon by Springy folk. It is perfectly valid to do so..

Sorry to sound off here but could input to the topic be constrained to
why
it might be that Struts somehow messes up the redirect by picking this
bean
up even though there are no references to it an any of the struts action
beans or in the struts.xml.. I think we can infer from this that if any
context file, regardless of purpose (related to Struts, data access or
any
other whatever) declared a String as a bean this will mess struts
redirects
up.. which is something that shouldn't happen.




On 09/05/2011 11:16, Ilya Kazakevich wrote:

Not sure you can use primitive wrappers and strings as spring beans.
For
example autowiring does not work for them.
Try the following:

1) inject literal directly
Instead of
<property ref="myString"
Try
<property value="myStringContent"

2) Create your own wrapper for string like Configuration class with
method
getMyProperty


Ilya Kazakevich,
Developer
JetBrains Inc
http://www.jetbrains.com
"Develop with pleasure!"

-----Original Message-----
From: Marcus [mailto:mar...@marcusbond.co.uk]
Sent: Monday, May 09, 2011 11:27 AM
To: user@struts.apache.org
Subject: Re: Strange behaviour with Spring

Not sure what you mean, the bean I'm referring to is a Spring bean not
a
JavaBean (two unrelated concepts).. there is no requirement when using
the Spring framework to not create Spring beans of type String.

Regardless, this doesn't help explain why the String is being picked up
by the Struts framework and set on the redirect when there is nothing
in
the configuration to indicate it should..

On 09/05/2011 07:13, Chris Pratt wrote:

You can't create beans that implement java.lang.String, it's immutable
and
doesn't follow the bean spec.
(*Chris*)

On Sun, May 8, 2011 at 2:11 PM, Marcus Bond<mar...@marcusbond.co.uk>

wrote:

Hi,
I'm using Struts 2.2.3 and have observed some bizarre behavior when
using
Spring to provide my actions.. In order to simplify this and prove
the
problem I have created a project with a single static html file, and
a
single action in struts.xml which references a bean in my spring
context
file.

What basically happens is that if I declare a bean in my spring
context
(bean unrelated toany struts action) that is of class
java.lang.String
(as I
do for a log4j filepath) then when I perform a redirect in an action
mapping
this gets appended to the end of the url as the anchor.
If I navigate to http://localhost:8080/My App/simpleRedirect
the result is a reirect to the 'simple' action but note the url
struts
has
redirected to:


http://localhost:8080/MyApp/simple#this%20is%20a%20java.lang.String%20bean%2
0in%20my%20spring%20context

For some reason the
org.apache.struts2.dispatcher.ServletRedirectResult
class is being instantiated by with the anchor and location
constructor
args
set to the value of my spring bean by the StrutsSpringObjectFactory
If I remove the String bean from the spring contect then the url
behaves
as
normal, redirecting to:
http://localhost:8080/MyApp/simple

Have been scratching my head trying to find where this behaviour is
happening but have run out of time.. is this a known issue?

Files content:
*Spring context file:*

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans";
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";
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd";>

<!-- Expose String as a bean (usually for a file path)-->
<!-- Picked up by Struts and set as location and anchor on a
redirect
and presented in url
If commented out this does not happen -->
<bean id="someFileName" class="java.lang.String">
<constructor-arg value="this is a java.lang.String bean in my

spring
context" />
</bean>

<!-- action beans -->
<bean name ="simpleAction"

class="uk.co.marcusbond.action.SimpleAction"
scope="prototype" />
</beans>

*Struts file:*
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd";>
<struts>
<package name="simple" extends="struts-default">
<!-- returns success and shows index.html -->
<action name="simple"
class="simpleAction">
<result>index.html</result>
</action>

<!-- redirects through the 'simple' action -->
<action name="simpleRedirect">
<result name="success" type="redirect">simple</result>
</action>
</package>
</struts>

*Java class uk.co.marcusbond.action.SimpleAction*
package uk.co.marcusbond.action;

public class SimpleAction {

public String execute() {
return "success";
}
}




__________ NOD32 6105 (20110508) Information __________

This message was checked by NOD32 antivirus system.
http://www.eset.com


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org



__________ NOD32 6106 (20110509) Information __________


This message was checked by NOD32 antivirus system.
http://www.eset.com




---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org

Reply via email to