我试图避免通过 JAX-RS
和 RESTeasy
处理客户端请求中的样板代码。我有几个类(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"),输入 User
为 Company
,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/