Issue Details (XML | Word | Printable)

Key: OPENEJB-756
Type: Improvement Improvement
Status: Closed Closed
Resolution: Fixed
Priority: Minor Minor
Assignee: Dain Sundstrom
Reporter: scott selikoff
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
OpenEJB

Allow CMP2 ejbSelect returning void for UPDATE and DELETE queries

Created: 20/Feb/08 08:56 PM   Updated: 01/Mar/08 07:32 PM
Return to search
Component/s: cmp2
Affects Version/s: 3.0-beta-2
Fix Version/s: 3.0

Time Tracking:
Original Estimate: 4h
Original Estimate - 4h
Remaining Estimate: 4h
Remaining Estimate - 4h
Time Spent: Not Specified
Remaining Estimate - 4h

Environment: N/A

Resolution Date: 01/Mar/08 07:32 PM


 Description  « Hide
The method Cmp2Generator.createSelectMethod() does not support "none" return type. If an ejb.select method is created with result-type-mapping="none", then the return type will return type will get converted to void. This will throw a non-descriptive NullPointerException on line 778, since the return of Cmp2Generator.Convert.getConversion() will be null.

Recommendations:

FIX #1: Better error message than NullPointerException

A better error message would be appreciated here as is seen in the fromObjectTo() method such as:

public static void fromObjectTo(MethodVisitor mv, Class to) {
            if (to.equals(Object.class)) {
                // direct assignment will work
            } else if (!to.isPrimitive()) {
                mv.visitTypeInsn(CHECKCAST, Type.getInternalName(to));
            } else {
                Convert conversion = getConversion(to);
                if (conversion == null) throw new NullPointerException("unsupported conversion for EJB select return type " + from.getName());
                conversion.objectToPrimitive(mv);
            }
        }

FIX #2: Add void as a supported type. Also, verify doing so would not be a spec violation.


TO REPRODUCE: Create a bean method such as the following:

/**
* @ejb.transaction
* type="Mandatory"
* @ejb.select
* query="DELETE FROM someSCHEMA as a WHERE a.someId=?1"
* result-type-mapping="none"
*
* @param someId
*/
public abstract void ejbSelectRemoveById(java.lang.Integer someId) throws FinderException;

Disclaimer: I take no responsibility in the code sample... I was the one charged with debugging it when upgrading from Geronimo 1 to 2.1, not writing it. I understand there are better ways to do this.

 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Dain Sundstrom added a comment - 01/Mar/08 07:32 PM
I will implement option 2. When an ejbSelect method returns void, the CMP engine will assume that the query is an UPDATE or DELETE query, and will execute javax.persistence.Query.executeUpdate(). Unfortunately, there is no way to propagate the return value from the executeUpdate method since the ejbSelect method returns void. This feature is outside of the EJB spec and therefore will most likely not work in other application servers.

Dain Sundstrom added a comment - 01/Mar/08 07:32 PM
Committed revision 632648.