Nice :) But I would suggest you start using Tapestry 5.1. The new spring integration is very convenient and enables you for example to inject tapestry services into spring beans. The only thing which you should look for is that if you have two beans which can be assigned to the same type, you cannot inject them the simple way but need to inject ApplicationContext to be able to get the bean by name.
What I mean by this: I have two beans like this: <bean id="dao" parent="baseTransactionProxy"> <property name="target"> <ref local="daoImpl"/> </property> </bean> <bean id="daoImpl" class="my.company.dao.DaoImpl" /> Since both are assignable to Dao interface I can't just @Inject Dao dao; but have to use @Inject ApplicationContext appContext; private Dao dao; ... Object onSomeActionFromSomeComponent() { dao = (Dao) appContext.getBean("dao"); List<SomeType> = dao.findAll(SomeType.class); ... return null; } Also you have some minor deprecations which should be updated to the new way. For example you don't use ComponentResources anymore to create pagelinks, but PageRenderLinkSource . Otherwise the transition is very smooth and the additional features in Tapestry 5.1 are well worth the small effort. 2009/5/6 mraible <m...@raibledesigns.com> > > That worked - thanks! > > Matt > > > Otho wrote: > > > > Hi, > > > > 1) Turn production mode to false in AppModule.java. You get much better > > exception reporting then. > > > > The exception you mentioned is caused by: > > > > org.apache.tapestry5.internal.services.TransformationExceptionUnable to > > add > > new method public final void setFrom(java.lang.String) as it already > > exists. > > > > If you set the @Property annotation you don't write primitive setters > > anymore. Commenting this out gives thes next problem: > > > > org.apache.tapestry5.internal.services.RenderQueueExceptionRender queue > > error in BeginRender[Login:outputraw]: Failure reading parameter 'value' > > of > > component Login:outputraw: Embedded component(s) form are defined within > > component class com.company.webapp.components.UserForm (or a super-class > > of > > UserForm), but are not present in the component template > > (classpath:com/company/webapp/components/UserForm.tml). > > > > If you explicitly define a @Component in the class you need to use the > > implicit (variable name) id or assign a descriptive id. > > > > In UserForm.tml change <t:form> to <t:form t:id="form"> and it works. > > > > 2) Something in your setup, I suspect the aspectj compile stage, > > successfully defeats tapestry live class reloading via mvn compile. This > > is > > a nuisance you should look into when you got the time. > > > > Regards, > > Otho > > > > > > > > > > > > > > 2009/5/4 mraible <m...@raibledesigns.com> > > > >> > >> Should be fixed now. Sorry about that. > >> > >> Matt > >> > >> > >> Robert Zeigler wrote: > >> > > >> > Tried dl'ing and running and received the following error: > >> > [ERROR] BUILD ERROR > >> > [INFO] > >> > > >> ------------------------------------------------------------------------ > >> > [INFO] Failed to resolve artifact. > >> > > >> > GroupId: org.appfuse.plugins > >> > ArtifactId: appfuse-maven-plugin > >> > Version: 2.1-SNAPSHOT > >> > > >> > Reason: Unable to download the artifact from any repository > >> > > >> > org.appfuse.plugins:appfuse-maven-plugin:pom:2.1-SNAPSHOT > >> > > >> > from the specified remote repositories: > >> > central (http://repo1.maven.org/maven2), > >> > appfuse (http://oss.sonatype.org/content/groups/appfuse) > >> > > >> > > >> > Robert > >> > > >> > On May 2, 2009, at 5/211:25 PM , mraible wrote: > >> > > >> >> > >> >> I'm using Tapestry 5.0.14. You can download the project from > >> >> http://static.raibledesigns.com/downloads/basic-tapestry.zip. > >> >> > >> >> Matt > >> >> > >> >> > >> >> Robert Zeigler wrote: > >> >>> > >> >>> Hi Matt, > >> >>> > >> >>> Hm, that's an odd exception. > >> >>> The way BeanEditForm works is to lookup an "editor block" for each > >> >>> property, based on the "datatype" for that property (datatype is > >> >>> determined by the DataTypeAnalyzer service; lookup of the block is > >> >>> the > >> >>> job of the BeanBlockSource service). The information needed for > each > >> >>> of the editor blocks to function is stashed in a > >> >>> "PropertyEditContext", which is made available to the blocks by the > >> >>> BeanEditor component via the Enviromental service. Which is why I'm > >> >>> saying your exception looks weird: it's saying that the > >> >>> PropertyEditContext wasn't available from the environment. Since > >> >>> this > >> >>> presumably happens while rendering the bean editor, it's weird, > >> >>> because property edit context /should/ be available! > >> >>> > >> >>> The mailing list strips attachments; can you post the project > >> >>> elsewhere? > >> >>> Also, what version of t5? > >> >>> > >> >>> Robert > >> >>> > >> >>> On May 2, 2009, at 5/210:46 PM , mraible wrote: > >> >>> > >> >>>> > >> >>>> I was able to fix the problem by commenting out field.isRequired() > >> >>>> in the > >> >>>> following method: > >> >>>> > >> >>>> > >> >>>> public void insideLabel(Field field, Element labelElement) { > >> >>>> if (inError(field)) { > >> >>>> addErrorClassToCurrentElement("error"); > >> >>>> }/* > >> >>>> if (field.isRequired()) { > >> >>>> labelElement.raw(" *"); > >> >>>> }*/ > >> >>>> > >> >>>> } > >> >>>> > >> >>>> Is there a way to use similar logic and prevent the exception from > >> >>>> happening? > >> >>>> > >> >>>> Thanks, > >> >>>> > >> >>>> Matt > >> >>>> > >> >>>> > >> >>>> mraible wrote: > >> >>>>> > >> >>>>> I tried using your hint by changing my template to the following: > >> >>>>> > >> >>>>> <t:layout title="message:personDetail.title" > >> >>>>> heading="message:personDetail.heading" > >> >>>>> menu="literal:PersonMenu" > >> >>>>> xmlns:t=" > >> http://tapestry.apache.org/schema/tapestry_5_0_0.xsd > >> >>>>> "> > >> >>>>> > >> >>>>> <t:messagebanner t:id="message" type="type"/> > >> >>>>> > >> >>>>> <form t:id="personForm" clientValidation="true"> > >> >>>>> <t:errors/> > >> >>>>> > >> >>>>> <div class="t-beaneditor"> > >> >>>>> <t:beaneditor t:id="person" object="person" > >> >>>>> exclude="id"/> > >> >>>>> > >> >>>>> <div class="t-beaneditor-row" style="text-align: > center"> > >> >>>>> <input type="submit" id="save" > >> >>>>> value="message:button.save"/> > >> >>>>> <input t:type="submit" t:id="delete" id="delete" > >> >>>>> value="message:button.delete"/> > >> >>>>> <input t:type="submit" t:id="cancel" id="cancel" > >> >>>>> value="message:button.cancel"/> > >> >>>>> </div> > >> >>>>> </div> > >> >>>>> </form> > >> >>>>> > >> >>>>> <script type="text/javascript"> > >> >>>>> Form.focusFirstElement($("personForm")); > >> >>>>> </script> > >> >>>>> > >> >>>>> </t:layout> > >> >>>>> > >> >>>>> Unfortunately, I still get the same error when trying to view this > >> >>>>> page: > >> >>>>> > >> >>>>> [exec] ERROR [btpool0-3] PersonForm.run(78) | Render queue > >> >>>>> error in > >> >>>>> AfterRender[PersonForm:person.loop]: Failure reading parameter > >> >>>>> 'validate' > >> >>>>> of component core/PropertyEditBlocks:datefield: No object of type > >> >>>>> org.apache.tapestry5.services.PropertyEditContext is available > from > >> >>>>> the > >> >>>>> Environment. Available types are > >> >>>>> org.apache.tapestry5.RenderSupport, > >> >>>>> org.apache.tapestry5.ValidationDecorator, > >> >>>>> org.apache.tapestry5.ValidationTracker, > >> >>>>> org.apache.tapestry5.internal.services.ClientBehaviorSupport, > >> >>>>> org.apache.tapestry5.services.FormSupport, > >> >>>>> org.apache.tapestry5.services.Heartbeat. > >> >>>>> [exec] > org.apache.tapestry5.ioc.internal.util.TapestryException: > >> >>>>> Failure reading parameter 'validate' of component > >> >>>>> core/PropertyEditBlocks:datefield: No object of type > >> >>>>> org.apache.tapestry5.services.PropertyEditContext is available > from > >> >>>>> the > >> >>>>> Environment. Available types are > >> >>>>> org.apache.tapestry5.RenderSupport, > >> >>>>> org.apache.tapestry5.ValidationDecorator, > >> >>>>> org.apache.tapestry5.ValidationTracker, > >> >>>>> org.apache.tapestry5.internal.services.ClientBehaviorSupport, > >> >>>>> org.apache.tapestry5.services.FormSupport, > >> >>>>> org.apache.tapestry5.services.Heartbeat. [at > >> >>>>> classpath:org/apache/tapestry5/corelib/components/BeanEditor.tml, > >> >>>>> line 3, > >> >>>>> column 47] > >> >>>>> [exec] at > >> >>>>> org > >> >>>>> .apache > >> >>>>> .tapestry5 > >> >>>>> .internal > >> >>>>> .structure > >> >>>>> > .ComponentPageElementImpl.invoke(ComponentPageElementImpl.java:909) > >> >>>>> [exec] at > >> >>>>> org > >> >>>>> .apache > >> >>>>> .tapestry5.internal.structure.ComponentPageElementImpl.access > >> >>>>> $200(ComponentPageElementImpl.java:50) > >> >>>>> [exec] at > >> >>>>> org.apache.tapestry5.internal.structure.ComponentPageElementImpl > >> >>>>> $6.render(ComponentPageElementImpl.java:189) > >> >>>>> [exec] at > >> >>>>> org > >> >>>>> .apache > >> >>>>> .tapestry5 > >> >>>>> .internal.services.RenderQueueImpl.run(RenderQueueImpl.java:68) > >> >>>>> [exec] at > >> >>>>> org > >> >>>>> .apache > >> >>>>> .tapestry5 > >> >>>>> .internal > >> >>>>> .services.PageRenderQueueImpl.render(PageRenderQueueImpl.java:108) > >> >>>>> [exec] at > >> >>>>> $ > >> >>>>> PageRenderQueue_12104869ca2 > >> >>>>> .render($PageRenderQueue_12104869ca2.java) > >> >>>>> [exec] at > >> >>>>> $ > >> >>>>> PageRenderQueue_12104869c9b > >> >>>>> .render($PageRenderQueue_12104869c9b.java) > >> >>>>> [exec] at > >> >>>>> org.apache.tapestry5.services.TapestryModule > >> >>>>> $15.renderMarkup(TapestryModule.java:1128) > >> >>>>> [exec] at > >> >>>>> com.company.webapp.services.AppModule > >> >>>>> $1.renderMarkup(AppModule.java: > >> >>>>> 138) > >> >>>>> > >> >>>>> Here is my PersonForm.java class: > >> >>>>> > >> >>>>> package com.company.webapp.pages; > >> >>>>> > >> >>>>> import org.apache.tapestry5.ioc.annotations.Inject; > >> >>>>> import org.apache.tapestry5.annotations.Component; > >> >>>>> import org.apache.tapestry5.annotations.InjectPage; > >> >>>>> import org.apache.tapestry5.annotations.Property; > >> >>>>> import org.apache.tapestry5.annotations.Persist; > >> >>>>> import org.apache.tapestry5.annotations.Service; > >> >>>>> import org.apache.tapestry5.corelib.components.EventLink; > >> >>>>> import org.apache.tapestry5.corelib.components.Form; > >> >>>>> import org.apache.tapestry5.PersistenceConstants; > >> >>>>> > >> >>>>> import org.appfuse.service.GenericManager; > >> >>>>> import com.company.model.Person; > >> >>>>> > >> >>>>> import org.slf4j.Logger; > >> >>>>> > >> >>>>> import java.util.List; > >> >>>>> > >> >>>>> public class PersonForm extends BasePage { > >> >>>>> @Inject > >> >>>>> private Logger log; > >> >>>>> > >> >>>>> @Inject > >> >>>>> @Service("personManager") > >> >>>>> private GenericManager<Person, Long> personManager; > >> >>>>> > >> >>>>> @Persist @Property > >> >>>>> private Person person; > >> >>>>> > >> >>>>> public Person getPerson() { > >> >>>>> return person; > >> >>>>> } > >> >>>>> > >> >>>>> /** > >> >>>>> * Allows setting person object from another class (i.e. > >> >>>>> PersonList) > >> >>>>> * > >> >>>>> * @param person an initialized instance > >> >>>>> */ > >> >>>>> public void setPerson(Person person) { > >> >>>>> this.person = person; > >> >>>>> } > >> >>>>> > >> >>>>> @InjectPage > >> >>>>> private PersonList personList; > >> >>>>> > >> >>>>> @Component(id = "personForm") > >> >>>>> private Form form; > >> >>>>> > >> >>>>> private boolean cancel; > >> >>>>> private boolean delete; > >> >>>>> > >> >>>>> void onValidateForm() { > >> >>>>> if (!delete && !cancel) { > >> >>>>> // manually validate required fields or annotate the > >> >>>>> Person > >> >>>>> object > >> >>>>> /*if (foo.getProperty() == null || > >> >>>>> user.getProperty().trim().equals("")) { > >> >>>>> form.recordError("Property is a required field."); > >> >>>>> }*/ > >> >>>>> } > >> >>>>> } > >> >>>>> > >> >>>>> void onActivate(Long id) { > >> >>>>> if (id != null) { > >> >>>>> person = personManager.get(id); > >> >>>>> } > >> >>>>> } > >> >>>>> > >> >>>>> Object onSuccess() { > >> >>>>> if (delete) return onDelete(); > >> >>>>> if (cancel) return onCancel(); > >> >>>>> > >> >>>>> log.debug("Saving person..."); > >> >>>>> > >> >>>>> boolean isNew = (getPerson().getId() == null); > >> >>>>> > >> >>>>> personManager.save(person); > >> >>>>> > >> >>>>> String key = (isNew) ? "person.added" : "person.updated"; > >> >>>>> > >> >>>>> if (isNew) { > >> >>>>> personList.addInfo(key, true); > >> >>>>> return personList; > >> >>>>> } else { > >> >>>>> addInfo(key, true); > >> >>>>> return this; > >> >>>>> } > >> >>>>> } > >> >>>>> > >> >>>>> void onSelectedFromDelete() { > >> >>>>> log.debug("Deleting person..."); > >> >>>>> delete = true; > >> >>>>> } > >> >>>>> > >> >>>>> void onSelectedFromCancel() { > >> >>>>> log.debug("Cancelling form..."); > >> >>>>> cancel = true; > >> >>>>> } > >> >>>>> > >> >>>>> Object onDelete() { > >> >>>>> personManager.remove(person.getId()); > >> >>>>> personList.addInfo("person.deleted", true); > >> >>>>> return personList; > >> >>>>> } > >> >>>>> > >> >>>>> Object onCancel() { > >> >>>>> return personList; > >> >>>>> } > >> >>>>> } > >> >>>>> > >> >>>>> I've attached my project which you should be able to run with "mvn > >> >>>>> jetty:run -Ph2". To reproduce, go to http://localhost:8080/ > >> >>>>> personform and > >> >>>>> login with admin/admin. > >> >>>>> > >> >>>>> Thanks, > >> >>>>> > >> >>>>> Matt > >> >>>>> > >> >>>>> > >> >>>>> > >> >>>>> > >> >>>>> Thiago H. de Paula Figueiredo wrote: > >> >>>>>> > >> >>>>>> Em Sat, 02 May 2009 15:31:15 -0300, mraible > >> <m...@raibledesigns.com > >> >>>>>> > > >> >>>>>> escreveu: > >> >>>>>> > >> >>>>>>> I have the a Person.java object that I'm trying to use the > >> >>>>>>> BeanEditForm > >> >>>>>>> component with. It has no Tapestry annotations in it. Is it > >> >>>>>>> possible to > >> >>>>>>> use the BeanEditForm component with it? > >> >>>>>> > >> >>>>>> Yes. By the way, I've never used any Tapestry annotation in my > >> >>>>>> POJOs. > >> >>>>>> > >> >>>>>>> <t:layout title="message:personDetail.title" > >> >>>>>>> heading="message:personDetail.heading" > >> >>>>>>> menu="literal:PersonMenu" > >> >>>>>>> > >> >>>>>>> xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> > >> >>>>>>> > >> >>>>>>> <t:beaneditform object="person" id="personForm" exclude="id"> > >> >>>>>>> <t:parameter name="buttons"> > >> >>>>>> > >> >>>>>> You're trying to override the edition block of a non-existent > >> >>>>>> BeanModel > >> >>>>>> property. Try adding add="buttons" to the BeanEditForm. > >> >>>>>> > >> >>>>>> Hint: instead of using BeanEditForm in this case, use a Form, an > >> >>>>>> Errors > >> >>>>>> and a BeanEditor. You'll have complete control on how to add the > >> >>>>>> submit > >> >>>>>> input (and any other thing you need). BeanEditForm = Form + > >> >>>>>> Errors + > >> >>>>>> BeanEditor + submit input. > >> >>>>>> > >> >>>>>> -- > >> >>>>>> Thiago H. de Paula Figueiredo > >> >>>>>> Independent Java consultant, developer, and instructor > >> >>>>>> http://www.arsmachina.com.br/thiago > >> >>>>>> > >> >>>>>> > >> --------------------------------------------------------------------- > >> >>>>>> 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://www.nabble.com/Problem-using-BeanEditForm-with-a-POJO-tp23349016p23352398.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 > >> >>> > >> >>> > >> >>> > --------------------------------------------------------------------- > >> >>> 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://www.nabble.com/Problem-using-BeanEditForm-with-a-POJO-tp23349016p23352566.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 > >> > > >> > > >> > --------------------------------------------------------------------- > >> > 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://www.nabble.com/Problem-using-BeanEditForm-with-a-POJO-tp23349016p23371856.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 > >> > >> > > > > > > -- > View this message in context: > http://www.nabble.com/Problem-using-BeanEditForm-with-a-POJO-tp23349016p23400496.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 > >