Aled,
You need to change back to <form:select path="contact.country">. The error
is most likely in your property editor - you must put in all the checks for
null/empty values, particularly if you allow a null value for country on a
website.
Mike.
On 7/10/07, Aled Rhys Jones <[EMAIL PROTECTED]> wrote:
Success - sort of.
I changed the jsp tags to:
<form:select path="contact.country.id">
<form:option value="" label="label for no value"/>
<form:options items="${countries}" itemLabel="name" itemValue="id" />
</form:select>
The page now loads and the correct country is shown.
If I try to save however, I get the following error:
Data Access Failure
identifier of an instance of com.myapp.model.Country was altered from 1
to 3; nested exception is org.hibernate.HibernateException: identifier
of an instance of com.myapp.model.Country was altered from 1 to 3
Any ideas?
Cheers
Aled
Aled Rhys Jones wrote:
> The plot thickens...
> As suggested I put in a checker for null in getAsText of the
> CountryEditor and to return "" if that was the case.
> I also put a debug point in my Country model in the equals() method.
> The object being passed in is "", so I presume that the models being
> used to populate the list are null, even though the manager returns 3
> valid objects to be populated in the drop down list.
> So somehow these objects (list of countries) are going from valid
> Country objects to null objects.
>
> Aled Rhys Jones wrote:
>> Every time I try to use the below jsp tags I always get a jasper
>> exception. Contained within I think is a NullPointerException.
>>
>> Anything obviously wrong with the below please? I'm really
>> struggling with this and this drop down issue is stalling me quite a
>> bit.
>>
>> All the beans are setup ok. I presume I don't need a config for the
>> country editor since I'm not injecting anything but passing in the
>> manager as a constructor.
>> What is odd is that when debugging the set and get methods of the
>> country editor are never called.
>>
>> public class WebsiteFormController extends BaseFormController {
>>
>> private GenericManager<Website, Long> websiteManager = null;
>> private GenericManager<Country, Long> countryManager = null;
>> public void setWebsiteManager(GenericManager<Website, Long>
>> websiteManager) { this.websiteManager = websiteManager; }
>> public void setCountryManager(GenericManager<Country, Long>
>> countryManager) { this.countryManager = countryManager; }
>>
>> public WebsiteFormController() {
>> setCommandClass(Website.class);
>> setCommandName("website"); } protected Object
>> formBackingObject(HttpServletRequest request) throws Exception
>> { String id = request.getParameter("id"); Website
>> website;
>> if (!StringUtils.isBlank(id)) {
>> website = websiteManager.get(new Long(id)); }
>> else{
>> website = new Website();
>> Url url = new Url();
>> website.setUrl(url);
>> }
>> return website;
>> } public ModelAndView onSubmit(HttpServletRequest request,
>> HttpServletResponse response, Object
>> command, BindException errors)
>> throws Exception { log.debug("entering 'onSubmit'
>> method..."); Website website = (Website) command;
>> boolean isNew = (website.getId() == null); String success =
>> getSuccessView(); Locale locale =
>> request.getLocale(); if
>> (request.getParameter("delete") != null) {
>> websiteManager.remove(website.getId());
>> saveMessage(request, getText("websiteForm.deleted", locale));
>> } else { websiteManager.save(website); String
>> key = (isNew) ? "websiteForm.added" : "websiteForm.updated";
>> saveMessage(request, getText(key, locale)); if
>> (!isNew) { success = "redirect:websiteform.html?id="
>> + website.getId(); } } return new
>> ModelAndView(success); }
>> protected Map referenceData(HttpServletRequest request) throws
>> Exception {
>> Map retval = new HashMap<String, Object>();
>> retval.put("countries", countryManager.getAll());
>> return retval;
>> }
>> @Override
>> protected void initBinder(HttpServletRequest request,
>> ServletRequestDataBinder binder) {
>> binder.registerCustomEditor(Country.class, "country", new
>> CountryEditor(countryManager));
>> }
>> }
>>
>> public class CountryEditor extends PropertyEditorSupport {
>> private GenericManager<Country, Long> countryManager = null;
>> public CountryEditor(GenericManager<Country, Long>
countryManager){
>> this.countryManager = countryManager;
>> }
>> /**
>> * (non-Javadoc)
>> *
>> * @see java.beans.PropertyEditor#setAsText(java.lang.String)
>> */
>> @Override
>> public void setAsText(String id) throws IllegalArgumentException {
>> Country country = countryManager.get(Long.valueOf(id));
>> setValue(country);
>> }
>> @Override
>> public String getAsText(){
>> Country country = (Country) getValue();
>> return String.valueOf(country.getId());
>> }
>>
>> }
>>
>> <form:select path="contact.country">
>> <form:option value="" label="label for no value"/>
>> <form:options items="${countries}" itemLabel="name" itemValue="id"
/>
>> </form:select>
>>
>> Any help would be appreciated.
>>
>> Thanks
>> Aled
>>
>> Michael Horwitz wrote:
>>> If your properties can be null, then you need to make sure your
>>> PropertyEditor can handle null values properly - a bit of unit
>>> testing should provide the test cover you need. You also need to
>>> provide an option in your dropdown list to match to the null value.
>>> Something like:
>>>
>>> <form:select path="contact.country">
>>> <form:option value="" label="label for no value"/>
>>> <form:options items="${countries}" itemLabel="name"
>>> itemValue="id" />
>>> </form:select>
>>>
>>> Mike
>>>
>>> On 7/8/07, *Aled Rhys Jones* <[EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>> wrote:
>>>
>>> Further to this (still can't save drop down list changes :-( ), I
>>> have
>>> an example where an object x contains an object y that can be
>>> selected
>>> using a drop down list, but y is currently null as I haven't added
>>> it to
>>> x yet (would be done using the drop down list).
>>> Is the trick here to create y in the formBackingObject and set the
>>> id to
>>> -1? Currently I get a null pointer in the property editor,
>>> presumably
>>> as its trying to compare the id or name of a null object.
>>>
>>> Aled Rhys Jones wrote:
>>> > Thanks for the replies Mike.
>>> >
>>> > Two issues with the below is that it doesn't seem to like me
>>> using
>>> > spring:form. Everything else seems to be form:form which seems
>>> to work.
>>> > I therefore tried the below using form:select, and I get the
>>> following
>>> > exception:
>>> > java.lang.NullPointerException
>>> > at
>>> >
>>>
>>>
org.springframework.web.servlet.tags.form.SelectedValueComparator.exhaustiveCompare
>>>
>>> (SelectedValueComparator.java:154)
>>> >
>>> > at
>>> >
>>>
>>>
org.springframework.web.servlet.tags.form.SelectedValueComparator.isSelected
(SelectedValueComparator.java:90)
>>>
>>> >
>>> > at
>>> >
>>> org.springframework.web.servlet.tags.form.OptionWriter.isSelected
>>> (OptionWriter.java:184)
>>> >
>>> > at
>>> >
>>>
>>> org.springframework.web.servlet.tags.form.OptionWriter.renderOption(
OptionWriter.java:172)
>>>
>>> >
>>> > at
>>> >
>>>
>>>
org.springframework.web.servlet.tags.form.OptionWriter.doRenderFromCollection
>>>
>>> (OptionWriter.java:155)
>>> >
>>> >
>>> > Cheers
>>> > Aled
>>> > Michael Horwitz wrote:
>>> >> Hmm. In that case you might want to take a look at Spring's
>>> form tags
>>> >> to make life a little easier:
>>> >>
>>>
>>>
http://static.springframework.org/spring/docs/2.0.x/reference/spring-form.tld.html
>>>
>>> >> <
>>>
>>>
http://static.springframework.org/spring/docs/2.0.x/reference/spring-form.tld.html
>
>>>
>>> >>
>>> >>
>>> >> So your JSP would look something like:
>>> >>
>>> >> <spring:form commandName="website" ...>
>>> >>
>>> >> ...
>>> >>
>>> >> <spring:select path="contact.country" items="${countries}"
>>> >> itemLabel="name" itemValue="id"/>
>>> >> ....
>>> >>
>>> >> </spring:form>
>>> >>
>>> >> A lot simpler and Spring will do all the hard work for you.
>>> As long
>>> >> as your form backing object has a non-null contact attribute,
it
>>> >> should all work like magic. I think the problem in your code is
>>> the
>>> >> name you attach to the select element - Spring expects specific
>>> names
>>> >> to get its bindings sorted out.
>>> >>
>>> >> Mike.
>>> >>
>>> >> On 7/6/07, *Aled Rhys Jones* < [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>
>>> >> <mailto:[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>>
>>> wrote:
>>> >>
>>> >> m4, wanted to finish off some functionality before updating
>>> to m5.
>>> >>
>>> >>
>>> >> Cheers
>>> >>
>>> >> Aled
>>> >>
>>> >>
>>> >>
>>> >>
>>>
>>>
------------------------------------------------------------------------
>>>
>>> >>
>>> >> *From:* Michael Horwitz [mailto: [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>
>>> >> <mailto:[EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>>]
>>> >> *Sent:* 06 July 2007 08:39
>>> >> *To:* [email protected]
>>> <mailto:[email protected]>
>>> <mailto:[email protected]
>>> <mailto:[email protected]>>
>>> >> *Subject:* Re: [appfuse-user] Drop down list population
>>> >>
>>> >>
>>> >> Which version of AppFuse are you using Aled?
>>> >>
>>> >> On 7/5/07, *Tsung* < [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]> <mailto: [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>>>
>>> >> wrote:
>>> >>
>>> >>
>>> >> Aled - Rather than having setCountryManager method, pass
the
>>> >> CountryManager
>>> >> referene in CountryEditor's constructor.
>>> >>
>>> >>
>>> >> --
>>> >> View this message in context:
>>> >>
>>> >>
>>>
>>>
http://www.nabble.com/Add-ManyToOne-relationship-between-user-and-a-new-pojo-tf3993393s2369.html#a11454095
>>>
>>> >>
>>> >>
>>> >> <
>>>
>>>
http://www.nabble.com/Add-ManyToOne-relationship-between-user-and-a-new-pojo-tf3993393s2369.html#a11454095
>
>>>
>>> >>
>>> >> Sent from the AppFuse - User mailing list archive at
>>> Nabble.com <http://Nabble.com>
>>> >> <http://nabble.com/>.
>>> >>
>>> >>
>>> >>
>>>
>>> ---------------------------------------------------------------------
>>> >> To unsubscribe, e-mail:
>>> [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>
>>> >> <mailto:[EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]> >
>>> >> For additional commands, e-mail:
>>> [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>
>>> >> <mailto:[EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>>
>>> >>
>>> >>
>>> >>
>>> >>
>>>
>>>
------------------------------------------------------------------------
>>>
>>> >>
>>> >> No virus found in this incoming message.
>>> >> Checked by AVG Free Edition. Version: 7.5.476 / Virus Database:
>>> >> 269.10.1/888 - Release Date: 06/07/2007 06:36
>>> >>
>>> >
>>> >
>>>
>>> ---------------------------------------------------------------------
>>> > To unsubscribe, e-mail: [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>
>>> > For additional commands, e-mail: [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>
>>> >
>>> >
>>> >
>>> >
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>
>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>> <mailto:[EMAIL PROTECTED]>
>>>
>>>
>>>
------------------------------------------------------------------------
>>>
>>>
>>> No virus found in this incoming message.
>>> Checked by AVG Free Edition. Version: 7.5.476 / Virus Database:
>>> 269.10.2/893 - Release Date: 09/07/2007 17:22
>>>
>>
>> ---------------------------------------------------------------------
>> 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]
>
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]