我有大量工作的EJB都正确持久化数据,然后就是这个没有持久存储到数据库或返回任何错误,它与其他EJB的唯一区别是它使用CDI @Inject两次
泽西资源:
@Path("/file")
@Stateless
public class FileResource extends Application
{
@Inject
private LibraryController libraryController; //getters setters omitted
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadWeb(InputStream inputStream)
{
getLibraryController().uploadFile();
}
}
CDI Bean:
@Named
@SessionScoped
public class LibraryController implements Serializable
{
@Inject
private FileEJBLocal fileEJB; //getters setters omitted
uploadFile()
{
File rootFile = new File();
try
{
getFileEJB().create(rootFile);
}
catch (Exception ex)
{
Logger.getLogger(LibraryController.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
EJB Bean:
@Stateless
public class FileEJB implements FileEJBLocal
{
@PersistenceContext(unitName = "myPersistenceUnit")
private EntityManager em;
@Override
public File create(File file) throws Exception
{
em.persist(file);
return file;
}
}
现在奇怪的是,如果不存在LibraryController并且我直接从Jersey Resource调用了EJB Bean,那么它将持续存在而没有错误。
更奇怪的是注入工作正常,并且在调试时,使用非null文件对象正确调用create(文件文件)方法!
编辑:我正在逐行仔细调试并使用phpmyadmin检查mysql数据库以查看文件何时实际持久化,以下是一种奇怪的行为:如果我持久保存文件并随后请求它使用以下代码
File File = new File();
File.setUuid("fffffffffabababbaba");
File.setId(new Long("129998"));
try
{ getFileEJB().create(File);
}
catch (Exception ex)
{ // log error
}
try
{ File FileReturned = getFileEJB().getFileById(new Long("129998"));
}
catch (Exception ex)
{ // log error
}
正确返回了FileReturned但是phpmyadmin显示数据库没有与文件一起保存。我开始认为不可能同时调试和检查数据库,可能数据是否存在于某些缓冲区表中? 也许是因为我正在使用Mysql连接池?
有什么想法吗?
注意:我正在使用Glassfish 4.0 Jersey 2.0和EclipseLink,但这不应该特定于此配置。