Hi! I have finally manager to create a very simple test case for my problem.

My issue with data loss seems to be related to the enctype of the form
(multipart/form-data) and the fact that I am loading data using a
preRenderView event.

To reproduce this problem, create a test page:

<html xmlns="http://www.w3.org/1999/xhtml";
      xmlns:h="http://java.sun.com/jsf/html";
      xmlns:f="http://java.sun.com/jsf/core";
      xmlns:ui="http://java.sun.com/jsf/facelets";>

<f:view contentType="text/html">

    <h:body>

        <h:form prependId="false" enctype="multipart/form-data">

            <f:metadata>
                <f:event type="preRenderView"
listener="#{playgroundController.load}"/>
            </f:metadata>

            <h:inputText value="#{playgroundController.car.colour}"/>
            <h:inputText value="#{playgroundController.car.make}"/>

            <h:outputText value="#{playgroundController.car}"/>

            <h:commandButton value="Talk"
actionListener="#{playgroundController.talk}"/>
        </h:form>

    </h:body>

</f:view>
</html>

With a backing bean behind:

@Controller
@Scope( "conversation.access" )
public class PlaygroundController implements Serializable {

    private Car car;

    public PlaygroundController() {
        System.out.println("\nNEW PLAY INSTANCE
"+Integer.toHexString(hashCode())+"\n");
    }

    public void load() {
        System.out.println("\nLOAD "+Integer.toHexString(hashCode())+"\n");
        car = new Car();
    }

    public void talk(ActionEvent evt) {
        System.out.println("CAR: "+car);
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }
}


If the enctype is multipart/form-data, when I click on the submit button,
the bean will be instantiated again and the load method won't be called...
throwing an ugly exception. If the enctype is the default, everything works
as expected and the method "talk(ActionEvent evt)" will print the car in the
console as expected.

I am using multipart/form-data because I wanted to upload some files. I can
see it is troublesome... anyone could explain me why?

Thanks!

Bruno


On 1 July 2010 17:09, Bruno Aranda <brunoara...@gmail.com> wrote:

> Hi,
>
> No I do not use portlets. I am now writing a simple test case, to see if I
> can reproduce it. With the simplest case, everything is working as expected,
> so there has to be some conflict with the rest of the application (e.g.
> Spring 3 proxies, the transaction manager or something else). I am
> investigating to see if I can reproduce it...
>
> The conversationContext is fine in both scenarios...
>
> Bruno
>
>
> On 1 July 2010 16:50, Mario Ivankovits <ma...@ops.co.at> wrote:
>
>> Heya!
>>
>> Please check the url parameter conversationContext has been added to each
>> and every url.
>>
>> If it is missing, a new context will be created each request and then a
>> new
>> bean will be created too.
>>
>> Now you sure would like to know why it is missing ... if it is missing.
>>
>> Hmmm ... do you use portlets or such?
>>
>>
>> Ciao,
>> Mario
>>
>> PS: Sorry for top-posting, Mail-Client oddities ... :)
>>
>> -----Ursprüngliche Nachricht-----
>> Von: Bruno Aranda [mailto:brunoara...@gmail.com]
>> Gesendet: Donnerstag, 01. Juli 2010 14:42
>> An: MyFaces Discussion
>> Betreff: Re: Problems with orchestra and JSF 2
>>
>> What I can see as well after putting a method with the @PostConstruct
>> annotation, is that this method is called every request, as if the
>> conversation didn't exist before, which is not true.
>>
>> I am outputting the orchestra logs in the console, and I can see:
>>
>> 2010-07-01 14:05:32,729 [qtp33228489-20] DEBUG (DebugPhaseListener,40) -
>> Before phase: RESTORE_VIEW(1)
>> 2010-07-01 14:05:32,823 [qtp33228489-20] DEBUG (Conversation,108) - start
>> conversation:general
>>
>> NEW INSTANCE PUBCONTROLLER HASH: 9f720d
>>
>> ==== POST CONS PUB === 9f720d
>>
>> NEW INSTANCE PUBCONTROLLER HASH: 147f75
>> NEW INSTANCE PUBCONTROLLER HASH: 1bbefe8
>>
>> 2010-07-01 14:05:32,844 [qtp33228489-20] DEBUG (Conversation,176) - put
>> bean
>> to conversation:org.springframework.beans.factory.support.Dispo
>> sablebeanadap...@25394361
>>
>> (bean=org.apache.myfaces.orchestra.conversation.spring.AbstractSpringOrchest
>> rascop...@17167e6
>> )
>> 2010-07-01 14:05:32,846 [qtp33228489-20] DEBUG (Conversation,176) - put
>> bean
>> to conversation:org.apache.myfaces.orchestra.conversation.sprin
>>
>> g.PersistenceContextConversationInterceptor.PERSISTENCE_CONTEXT(bean=org.apa
>> che.myfaces.orchestra.conversation.spring.PersistenceContextClos
>> e...@81f22c)
>> 2010-07-01 14:05:32,847 [qtp33228489-20] DEBUG (Conversation,176) - put
>> bean
>> to conversation:publicationController(bean=uk.ac.ebi.intact.edi
>> tor.controller.curate.publication.publicationcontrol...@9f720d)
>> 2010-07-01 14:05:32,853 [qtp33228489-20] DEBUG (DebugPhaseListener,35) -
>> After phase: RESTORE_VIEW(1)
>> ...
>>
>> The bean is called "publicationController", which should be maintained in
>> a
>> conversation called "general". And I see this every request. This is the
>> bean class annotations:
>>
>> @Controller
>> @Scope( "conversation.access" )
>> @ConversationName( "general" )
>> public class PublicationController extends AnnotatedObjectController {
>> ...}
>>
>> I fail to see why the bean is not re-used as the conversation is not
>> ended.
>>
>> And then, if I let the conversation expire, I see the message as many
>> times
>> as instances have been created (three requests in my case to the same
>> page...).
>>
>> 2010-07-01 14:39:28,563 [Orchestra:ConversationWiperThread] DEBUG
>> (Conversation,311) - destroy conversation:general
>> 2010-07-01 14:39:28,565 [Orchestra:ConversationWiperThread] DEBUG
>> (Conversation,311) - destroy conversation:general
>> 2010-07-01 14:39:28,566 [Orchestra:ConversationWiperThread] DEBUG
>> (Conversation,311) - destroy conversation:general
>>
>> So I am not sure what is happening here :(
>>
>> Bruno
>>
>> On 1 July 2010 13:27, Bruno Aranda <brunoara...@gmail.com> wrote:
>>
>> > I see, yes, that could explain it as Spring is creating proxies all over
>> > the place to make some of the annotations work. However I am not doing
>> > anything in the constructors, but for instance, if I set a property on a
>> > backing bean (conversation.access scope), when I click on a button that
>> > value seems to have been lost, as if I was accessing another object...
>> > probably something to do with proxies as well and orchestra?
>> >
>> > Thanks!
>> >
>> > Bruno
>> >
>> >
>> > On 1 July 2010 13:22, Mark Struberg <strub...@yahoo.de> wrote:
>> >
>> >> Hi Bruno!
>> >>
>> >> > First, could someone explain me why the
>> >> > beans constructor
>> >> is called multiple times?
>> >>
>> >> What you see might  be an effect of proxies.
>> >> Usually if a subclassing proxy gets initialised, the constructor of the
>> >> proxied class gets called.
>> >> This is the reason why it's not suggested to use constructors for
>> >> initialisations at all but instead use
>> >> @PostConstruct (resp @PreDestroy instead of finalize)
>> >>
>> >> LieGrue,
>> >> strub
>> >>
>> >>
>> >> ----- Original Message ----
>> >> > From: brunoaranda <brunoara...@gmail.com>
>> >> > To: MyFaces Discussion <users@myfaces.apache.org>
>> >> > Sent: Thu, July 1, 2010 12:55:30 PM
>> >> > Subject: Problems with orchestra and JSF 2
>> >> >
>> >> > Hi,
>> >>
>> >> I am having some troubles with orchestra maintaining some beans
>> >> > in
>> >> "conversation access" scope. First, could someone explain me why the
>> >> > beans
>> >> constructor is called multiple times? In my app I have multiple beans
>> >> > with
>> >> the same conversation name and when I access one of the other beans
>> from
>> >> > my
>> >> bean, it seems as it is picking a new instance. The same scenario works
>> >> > fine
>> >> using "session" beans, but of course then I lose all the nice
>> >> > transaction
>> >> management from Orchestra. Anyone with an idea where I can I
>> >> > look? How is
>> >> people dealing with JPA and transactions scoping multiple
>> >> > requests in JSF 2?
>> >>
>> >> I am having another issue as well. Even if I have one
>> >> > bean, the data seems
>> >> not to be in the model when I click on a button that
>> >> > invokes a method in
>> >> that bean. For this specific case, I have a
>> >> > <f:metadata> section with a
>> >> viewParam. I can see the param being set in
>> >> > the update model phase, but the
>> >> bean's existing data seems to be lost? For
>> >> > sure, I must be doing something
>> >> wrong but I am unable to see
>> >> > what.
>> >>
>> >> Thanks!
>> >>
>> >> Bruno
>> >>
>> >>
>> >>
>> >>
>> >
>>
>
>

Reply via email to