我正在使用DropWizard,我有一个Authenticator,它加载了一个具有延迟实例化集合的User对象。在资源中我尝试访问这些集合但是我得到一个LazyInitilizationException报告没有会话 - 但我在一个会话中因为该方法是注释@UnitOfWork。
我可以通过在Resource方法中重新加载用户对象来解决这个问题,但我认为Authenticator在与资源调用相同的休眠会话中工作。我做错了吗?有没有办法避免重新加载用户?
以下是我的代码提示:
PasswordAuthenticator
public class PasswordAuthenticator implements Authenticator<BasicCredentials, User> {
private UserDAO userDAO;
public PasswordAuthenticator(UserDAO userDAO) {
this.userDAO = userDAO;
}
@Override
public Optional<User> authenticate(BasicCredentials credentials) throws AuthenticationException {
String username = credentials.getUsername();
User user = userDAO.getUserByUsername(username);
// check password stuff
return Optional.of(user);
}
}
TicketResource
@Path("/tickets/")
@Produces(MediaType.APPLICATION_JSON)
public class TicketResource {
@GET
@UnitOfWork
public List<Ticket> getTickets(@Auth User caller) {
for(Ticket t : caller.getTickets()) { // Exception thrown here
// processing each ticket stuff
}
return listOfTickets;
}