I was able to solve this by using Spring's
AbstractTransactionalJUnit4SpringContextTests (to cache the
applicationContext) and adding a new ModuleDef to PageTester. Unfortunately,
SpringModuleDef seems to take ApplicationContext as a constructor argument
in 5.0.18, but not in 5.1.05.

@ContextConfiguration(locations = {
        "classpath:/applicationContext-resources.xml",
"classpath:/applicationContext-dao.xml",
        "classpath:/applicationContext-service.xml",
"classpath*:/applicationContext.xml",
        "/WEB-INF/applicationContext*.xml"})
public abstract class BasePageTestCase extends
AbstractTransactionalJUnit4SpringContextTests {
    protected PageTester tester;
    protected Document doc;
    protected Map<String, String> fieldValues;
    protected final Log log = LogFactory.getLog(getClass());
    protected static final String MESSAGES = Constants.BUNDLE_KEY;
    private int smtpPort = 25250;

    @Before
    public void before() {
        String appPackage = "org.appfuse.webapp";
        String appName = "app";
        tester = new PageTester(appPackage, appName, "src/main/webapp") {
            @Override
            protected ModuleDef[] provideExtraModuleDefs() {
                return new ModuleDef[]{new
SpringModuleDef(applicationContext)};
            }
        };

        fieldValues = new HashMap<String, String>();

        smtpPort = smtpPort + (int) (Math.random() * 100);

        // change the port on the mailSender so it doesn't conflict with an
        // existing SMTP server on localhost
        JavaMailSenderImpl mailSender = (JavaMailSenderImpl)
applicationContext.getBean("mailSender");
        mailSender.setPort(getSmtpPort());
        mailSender.setHost("localhost");
    }

    @After
    public void after() {
        if (tester != null) {
            tester.shutdown();
        }
        tester = null;
    }

    protected int getSmtpPort() {
        return smtpPort;
    }
}

Is there a better way to do this if I want to upgrade to Tapestry Spring
5.1.0.5?

Thanks,

Matt


mraible wrote:
> 
> I tried changing to locator.proxy and direct instantiation, but no dice.
> For proxy(), I used:
> 
>     public static void
> contributeMasterObjectProvider(OrderedConfiguration<ObjectProvider>
> configuration,
>                                                       ObjectLocator
> locator) {
>         configuration.add("spring", locator.proxy(ObjectProvider.class,
> SpringObjectProvider.class));
>     }
> 
> For direct instantiation, I used:
> 
>     public static void
> contributeMasterObjectProvider(OrderedConfiguration<ObjectProvider>
> configuration,
>                                                       ObjectLocator
> locator) {
>         TypeCoercer coercer = locator.getService(TypeCoercer.class);
>         configuration.add("spring", new SpringObjectProvider(coercer));
>     }
> 
> As I mentioned earlier, everything works fine when using Hibernate or JPA,
> but not with iBATIS. It hangs for a while (30+ seconds) and then spits out
> the error mentioned below). If I run the failed tests by themselves,
> everything works fine.
> 
> I could change my surefire settings to fork a new JVM for each test, but
> that doesn't seem right.
> 
> Is anyone testing their pages with PageTester and injecting Spring beans
> as part of that test? If so, are you using a SpringObjectProvider?
> 
> Thanks,
> 
> Matt
> 
> 
> 
> Howard Lewis Ship wrote:
>> 
>> There will be a trace in the console of what Tapestry IoC was doing
>> when it hit the issue.
>> 
>> However, this looks like the culprit:
>> 
>> 
>>    public static void contributeMasterObjectProvider(
>>            OrderedConfiguration<ObjectProvider> configuration,
>>            ObjectLocator locator) {
>>        configuration.add("spring", locator
>>                .autobuild(SpringObjectProvider.class));
>>    }
>> 
>> 
>> autobuilding will attmpt to instantiat SpringObjectProvider ... but
>> that will itself require injection that falls into the
>> MasterObjectProvider.  Either instantiate SOP yourself, or use the
>> proxy() method, which builds a proxy that can defer instantiation of
>> SOP until it is actually needed.
>> 
>> 
>> On Tue, Nov 10, 2009 at 1:55 PM, mraible <m...@raibledesigns.com> wrote:
>>>
>>> Hello all,
>>>
>>> I'm in the process of writing tests for AppFuse's Tapestry 5 integration
>>> and
>>> I've run into an interesting issue. When I use Hibernate or JPA as
>>> backends,
>>> my tests pass just fine. However, when I use iBATIS, they take forever
>>> and I
>>> get an OOM error and the following shows up in my logs:
>>>
>>> Construction of service 'InternalRequestGlobals' has failed due to
>>> recursion: the service depends on itself in some way. Please check
>>> org.apache.tapestry5.internal.services.InternalRequestGlobalsImpl() (at
>>> InternalRequestGlobalsImpl.java:22) via
>>> org.apache.tapestry5.internal.services.InternalModule.bind(ServiceBinder)
>>> (at InternalModule.java:65) for references to another service that is
>>> itself
>>> dependent on service 'InternalRequestGlobals'.
>>>
>>> Looking at the dependencies differences, my first guess is AspectJ is
>>> causing this, but I'm not sure.
>>>
>>> [INFO] +- org.appfuse:appfuse-ibatis:jar:2.1-SNAPSHOT:compile
>>> [INFO] |  +- org.appfuse:appfuse-data-common:jar:2.1-SNAPSHOT:compile
>>> [INFO] |  |  +- javax.persistence:persistence-api:jar:1.0:compile
>>> [INFO] |  |  +- javax.xml.bind:jaxb-api:jar:2.2:compile
>>> [INFO] |  |  |  \- javax.xml.stream:stax-api:jar:1.0-2:compile
>>> [INFO] |  |  \- org.compass-project:compass:jar:2.1.3:compile
>>> [INFO] |  |     \- org.apache.lucene:lucene-core:jar:2.4.1:compile
>>> [INFO] |  +- org.apache.ibatis:ibatis-sqlmap:jar:2.3.4.726:compile
>>> [INFO] |  +- org.aspectj:aspectjweaver:jar:1.6.6:compile
>>> [INFO] |  +- org.aspectj:aspectjrt:jar:1.6.6:compile
>>> [INFO] |  +- org.springframework:spring-aspects:jar:2.5.6:compile
>>> [INFO] |  +- commons-beanutils:commons-beanutils:jar:1.8.1:compile
>>> [INFO] |  +- org.springframework:spring-jdbc:jar:2.5.6:compile
>>> [INFO] |  |  \- org.springframework:spring-tx:jar:2.5.6:compile
>>> [INFO] |  \- org.springframework:spring-orm:jar:2.5.6:compile
>>>
>>>
>>> [INFO] +- org.appfuse:appfuse-hibernate:jar:2.1-SNAPSHOT:compile
>>> [INFO] |  +- org.appfuse:appfuse-data-common:jar:2.1-SNAPSHOT:compile
>>> [INFO] |  |  +- javax.persistence:persistence-api:jar:1.0:compile
>>> [INFO] |  |  +- javax.xml.bind:jaxb-api:jar:2.2:compile
>>> [INFO] |  |  |  \- javax.xml.stream:stax-api:jar:1.0-2:compile
>>> [INFO] |  |  \- org.compass-project:compass:jar:2.1.3:compile
>>> [INFO] |  |     \- org.apache.lucene:lucene-core:jar:2.4.1:compile
>>> [INFO] |  +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
>>> [INFO] |  |  +-
>>> org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
>>> [INFO] |  |  +- org.slf4j:slf4j-api:jar:1.4.2:compile
>>> [INFO] |  |  \- dom4j:dom4j:jar:1.6.1:compile
>>> [INFO] |  +- org.hibernate:hibernate-core:jar:3.3.1.GA:compile
>>> [INFO] |  |  +- antlr:antlr:jar:2.7.6:compile
>>> [INFO] |  |  \- javax.transaction:jta:jar:1.1:compile
>>> [INFO] |  +- javassist:javassist:jar:3.4.GA:compile
>>> [INFO] |  +- org.slf4j:slf4j-log4j12:jar:1.5.2:compile
>>> [INFO] |  +- org.hibernate:hibernate-ehcache:jar:3.3.1.GA:compile
>>> [INFO] |  +- net.sf.ehcache:ehcache-core:jar:1.7.0:compile
>>> [INFO] |  +- commons-beanutils:commons-beanutils:jar:1.8.1:compile
>>> [INFO] |  +- org.springframework:spring-jdbc:jar:2.5.6:compile
>>> [INFO] |  |  \- org.springframework:spring-tx:jar:2.5.6:compile
>>> [INFO] |  \- org.springframework:spring-orm:jar:2.5.6:compile
>>>
>>> I also suspect it might be coming from my SpringObjectProvider (used for
>>> testing).
>>>
>>> http://source.appfuse.org/browse/~raw,r=trunk/appfuse/trunk/web/tapestry/src/test/java/org/appfuse/webapp/services/SpringObjectProvider.java
>>>
>>> This is added by an IntegrationTestModule:
>>>
>>> public class IntegrationTestModule {
>>>
>>>    // contribution master object provider
>>>    public static void contributeMasterObjectProvider(
>>>            OrderedConfiguration<ObjectProvider> configuration,
>>>            ObjectLocator locator) {
>>>        configuration.add("spring", locator
>>>                .autobuild(SpringObjectProvider.class));
>>>    }
>>> }
>>>
>>> And wired into PageTester as follows:
>>>
>>> String appPackage = "com.mycompany.webapp";
>>> String appName = "app";
>>> tester = new PageTester(appPackage, appName, "src/main/webapp",
>>> IntegrationTestModule.class);
>>>
>>> Any help is appreciated.
>>>
>>> Thanks,
>>>
>>> Matt
>>> --
>>> View this message in context:
>>> http://old.nabble.com/Construction-of-service-%27InternalRequestGlobals%27-has-failed-due-to-recursion%3A-tp26291936p26291936.html
>>> Sent from the Tapestry - User mailing list archive at Nabble.com.
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>>> For additional commands, e-mail: users-h...@tapestry.apache.org
>>>
>>>
>> 
>> 
>> 
>> -- 
>> Howard M. Lewis Ship
>> 
>> Creator of Apache Tapestry
>> 
>> The source for Tapestry training, mentoring and support. Contact me to
>> learn how I can get you up and productive in Tapestry fast!
>> 
>> (971) 678-5210
>> http://howardlewisship.com
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>> For additional commands, e-mail: users-h...@tapestry.apache.org
>> 
>> 
>> 
> 
> 

-- 
View this message in context: 
http://old.nabble.com/Construction-of-service-%27InternalRequestGlobals%27-has-failed-due-to-recursion%3A-tp26291936p26296274.html
Sent from the Tapestry - User mailing list archive at Nabble.com.


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

Reply via email to