[ https://issues.apache.org/jira/browse/TAP5-2749?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Volker Lamp resolved TAP5-2749. ------------------------------- Fix Version/s: 5.8.3 Resolution: Fixed > Incorrect behavior of getIfExists in EntityApplicationStatePersistenceStrategy > ------------------------------------------------------------------------------ > > Key: TAP5-2749 > URL: https://issues.apache.org/jira/browse/TAP5-2749 > Project: Tapestry 5 > Issue Type: Bug > Components: tapestry-jpa > Affects Versions: 5.5.0, 5.8.2 > Reporter: Vladimir V. Bychkov > Assignee: Volker Lamp > Priority: Major > Fix For: 5.8.3 > > Time Spent: 40m > Remaining Estimate: 0h > > +Error description+ > Test [project > demonstrates|https://github.com/bvfalcon/tapestry-entity-state-test] an error > which was added during optimization TAP5-2478. > Methods > [get|https://github.com/apache/tapestry-5/blob/5.8.2/tapestry-core/src/main/java/org/apache/tapestry5/services/ApplicationStateManager.java#L57] > and > [getIfExists|https://github.com/apache/tapestry-5/blob/5.8.2/tapestry-core/src/main/java/org/apache/tapestry5/services/ApplicationStateManager.java#L67] > in ApplicationStateManager work different for JPA-Entities: first works > correct, second gives ClassCastException. > +Reason+ > By invoking > [ApplicationStateManager.set|https://github.com/apache/tapestry-5/blob/5.8.2/tapestry-core/src/main/java/org/apache/tapestry5/services/ApplicationStateManager.java#L87] > method EntityApplicationStatePersistenceStrategy.set is used, which > [*transforms*|https://github.com/apache/tapestry-5/blob/5.8.2/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java#L70] > instanceof Entity-class to instance of PersistedEntity Class. > By Invoking ApplicationStateManager.get method > EntityApplicationStatePersistenceStrategy.get is used, which > [*transforms*|https://github.com/apache/tapestry-5/blob/5.8.2/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java#L44] > instanceof PersistedEntity Class back to Entity-class. Therefore [this > code|https://github.com/bvfalcon/tapestry-entity-state-test/blob/master/src/main/java/org/apache/tapestry/components/Layout.java#L14] > works correct. > By Invoking ApplicationStateManager.getIfExists method > SessionApplicationStatePersistenceStrategy.getIfExists is used > (SessionApplicationStatePersistenceStrategy is a superclass for > EntityApplicationStatePersistenceStrategy), which > [*casts*|https://github.com/apache/tapestry-5/blob/5.8.2/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SessionApplicationStatePersistenceStrategy.java#L75] > instanceof PersistedEntity Class to Entity-class. This is incorrect and > gives ClassCastException in [this > code|https://github.com/bvfalcon/tapestry-entity-state-test/blob/master/src/main/java/org/apache/tapestry/components/Layout.java#L15]. > In other words, get makes back transformation, getIfExists - not. This is the > root of problem. > +Fix proposal+ > The best solution IMHO will be [restore > getIfExists|https://github.com/apache/tapestry-5/blob/5.5.0/tapestry-core/src/main/java/org/apache/tapestry5/services/ApplicationStatePersistenceStrategy.java#L57] > in EntityApplicationStatePersistenceStrategy, may be with some optimizations > from TAP5-2478. -- This message was sent by Atlassian Jira (v8.20.10#820010)