java - JAX-RS 与 RESTeasy Factory

标签 java jax-rs factory resteasy

我试图避免通过 JAX-RSRESTeasy 处理客户端请求中的样板代码。我有几个类(class),例如

class User{
    private String name;
    private String username;
    private String address;
    private long id;

    //getters and setters
}

class Company{
    private String name;
    private String address;
    private String location;

    //getters and setters
}

我想要 create()update()delete()getAll() > 回应。例如,对于用户,我将拥有以下带有创建方法和后续更新、删除和 getAll 的类:

@Path ("/user")
public class UserApi {

    @PersistenceUnit
    private EntityManagerFactory emf;

    @POST
    @Path("/create")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String Create(@Form User user){

        EntityManager em = emf.createEntityManager();
        try{
            em.getTransaction().begin();
            em.merge(user);
            em.getTransaction().commit();
        }
        catch (Exception e){
            e.printStackTrace();
            em.getTransaction().rollback();

            return "{\"success\":false, \"msg\":\"Error occured, please  try later\"}";
        }
        return "{\"success\":true, \"msg\": \"Saved successfully\"}";
    } 

我必须为我拥有的每个类重复相同的代码。有人评论说使用工厂类来避免这种情况,也许使用泛型或接口(interface)。我很难弄清楚。请提出一个好的设计来解决这个问题。

最佳答案

您必须问自己所有实现之间的差异是什么。 在这种情况下,不多。您可以复制/粘贴这段代码,将 @Path("/user") 替换为 @Path("/company"),输入 UserCompany ,Bob 是您的叔叔。 Em.merge() 接受任何对象,所以我们并不关心。

因此,因为 @Path 注释对于所有人来说都是不同的,所以创建一个像这样的新 Api 是可以接受的;

@Path("/users")
@Stateless
public class UserApi extends AbstractCrudApi<User> {}

定义了此 REST 服务特有的所有元素。我们有 @Path 和 User,它们作为通用类型传递。

现在我们创建这个 AbstractCrudApi 抽象类。 abstract,因为我们想要实现所有 future 服务的通用逻辑。正如您所知,接口(interface)不能具有实现的方法。 (让我们忘记 java 8 default 方法)

@Produces(MediaType.APPLICATION_JSON)
public abstract class AbstractCrudApi<T> {

    @PersistenceContext
    private EntityManager em;

    @POST
    @Path("/create")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String create(@Form T entity) {
        try {
            em.getTransaction().begin();
            em.merge(entity);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
            return "{\"success\":false, \"msg\":\"Error occured, please  try later\"}";
        }
        return "{\"success\":true, \"msg\": \"Saved successfully\"}";
    }
}

这就是全部内容。 我不太明白工厂在这里有何优势。

另一个提示;尝试使用 javax.ws.rs.core.Response 返回类型而不是 String。这将允许您设置 http 响应状态以及响应正文。您还可以尝试使用 Jackson 来编码您的响应对象。检查resteasy-jackson2-provider

关于java - JAX-RS 与 RESTeasy Factory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44299943/

相关文章:

java - 如何创建工厂方法来用功能替换构造函数?

C++ Gmock - 使用 shared_ptr <FactoryClass> 的测试函数

java - 将 int 与 2 个值进行比较

java - 运算符(operator)不使用 If 语句和扫描器

java - java的接口(interface)问题

java - 如何在 ClientErrorException 中向 HTTP 响应添加 header ?

java - 自定义类上的 readEntity 抛出 MessageBodyProviderNotFoundException

java - Android Launcher3 - Google 即时页面

data-binding - InjectionUtils - 参数类没有构造函数

Python类工厂引用基类的问题?