将JAX-RS和JPA与Tomcat一起使用,而不是catch-finally

问题描述 投票:0回答:2

我们正在使用JAX-RS和JPA。我们使用具有以下结构的方法(详细信息省略):

@PUT
@Path("{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public ResultObject saveById(   @PathParam("id") BigInteger id, 
SomeObject someObject) {

    entityManager = EMF.obtainEntityManager();

    try {

      .. start transaction

      .. write all information to the database

      .. commit transaction

      .. return ResultObject
    } catch ( Exception exception) {

      .. rollback transaction

      .. return ResultObject together with an appropriate error
    } finally {
        entityManager.close();
    }           
}

有没有“最好”的方法来避免重复捕获并最终在我们创建的每个JAX-RS方法上?使用过滤器?我们的服务提供者仅支持Tomcat。没有Glassfish或其他容器。谢谢你的帮助。

java tomcat jpa jax-rs
2个回答
0
投票

我会将实现移动到REST服务调用的不同服务。 REST应该是您的API的一种类型。逻辑应该是不同的服务。

@PUT
@Path("{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public ResultObject saveById( @PathParam("id") BigInteger id, SomeObject someObject) {
    ResultObject resultObject = new ResultObject();
    ResultType res = someService.saveById(id, someObject)
    // do something with res
    return resultObject ;
}

然后在SomeService中实现一些可以实现事务逻辑的抽象类。

public abstract class AbstractService {
    protected void startTransaction() {
        //...
    }
    protected void endTransaction() {
        //...
    }
}

public class SomeService extends AbstractService {
   public ResultType saveById(BigInteger id, SomeObject someObject) {
       startTransaction();
       // your logic
       endTransaction();
   }
}

还有更好的方法。如果你知道的话,可以使用Spring Framework。在该解决方案中,您使用@Transactional注释SomeService(或该类中的方法)。

@Transactional
public class SomeService {
   public ResultType saveById(BigInteger id, SomeObject someObject) {

       // your logic

   }
}

0
投票

在过滤器中创建EntityManager

例如:-

public class EntityManagerFilter implements Filter {


  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    EntityManager em = null;
    try {
      /
      em = EntityManagerFactoryUtil.entityManagerFactory.createEntityManager();
     //
      EntityManagerUtil.ENTITY_MANAGERS.set(em);
      chain.doFilter(request, response);
      EntityManagerUtil.ENTITY_MANAGERS.remove();
      //

    } catch (Exception ex) {
      //

    } finally {
      try {
        if (em != null) {
          em.close();
          //
        };
      } catch (Throwable t) {
       //
      }
    }
  }

  public void init(FilterConfig config) {
    destroy();
    initEntityManagerFactory();
  }

  private void initEntityManagerFactory() {
    EntityManagerFactoryUtil.entityManagerFactory =
        Persistence.createEntityManagerFactory("PersistanceUnitName");
   //

  }

  public void destroy() {
   //
    try {
      if (EntityManagerFactoryUtil.entityManagerFactory != null) {
        EntityManagerFactoryUtil.entityManagerFactory.close();
      };
    } catch (Exception t) {
     /
  }
}

public class EntityManagerUtil {



 public static final ThreadLocal<EntityManager> ENTITY_MANAGERS = new ThreadLocal<EntityManager>();

  /** Returns a fresh EntityManager */
  public static EntityManager getEntityManager() {
    return ENTITY_MANAGERS.get();
  }

}

public class EntityManagerFactoryUtil {

  public static EntityManagerFactory entityManagerFactory;
}
© www.soinside.com 2019 - 2024. All rights reserved.