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 <[email protected]>
>>>> 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: [email protected]
>>>> For additional commands, e-mail: [email protected]
>>>>
>>>>
>>>>
>>>
>>>
>>
>> --
>> 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: [email protected]
>> For additional commands, e-mail: [email protected]
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
>
--
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: [email protected]
For additional commands, e-mail: [email protected]