On 03/07/2012 14:27, Bob Lannoy wrote:
Hi,I've written a job to delete users in a specific status (toBeRemoved). Unfortunately I get a nullpointer exception. This is what I do: NodeCond searchCond = new NodeCond(); SyncopeUserCond syncopeUserCond = new SyncopeUserCond(); syncopeUserCond.setSchema("status"); syncopeUserCond.setExpression("toBeRemoved"); syncopeUserCond.setType(org.apache.syncope.client.search.AttributeCond.Type.EQ); searchCond.setSyncopeUserCond(syncopeUserCond); searchCond.setType(org.apache.syncope.client.search.NodeCond.Type.LEAF); List<SyncopeUser> users=searchDAO.search(EntitlementUtil.getRoleIds(entitlementDAO.findAll()), searchCond); for (SyncopeUser user : users){ userDAO.delete(user.getId()); } The nullpointer exception occurs on the delete. In that method it looks for memberships but those are empty, thus the nullpointer. When I look at the user-object in debug mode I see that even the attributes are not present in the object. So it seems that I do not get a complete object back from the search. Only the core attributes like username, status, password, token The same search in console gives me everything (firstname, last name, ...) What am I doing wrong?
As far as I can imagine, you are hitting a known JPA issue with lazy loading and transactions: to make it short, the SyncopeUser object that you get is not "complete", but some collections (i.e. JPA relations) are populated upon reading, and this can only happen in a valid transactional scope.
When you call UserDAO.delete(SyncopeUser), this will attempt to use the provided object for operations, but since you are outside a transactional scope, you'll hit the NPE.
Take a look at SyncJob: it extends AbstractTaskJob (like your job, I suppose) and performs almost any operation on SyncopeUser objects by delegating to other @Autowired objects living in a transactional scope: look in particular the deleteUsers() method.
Hope this helps. Regards. -- Francesco Chicchiriccò ASF Member, Apache Cocoon PMC and Apache Syncope PPMC Member http://people.apache.org/~ilgrosso/
