2017-06-01 19 views
0

我試圖避免通過JAX-RSRESTeasy處理我客戶的請求中的樣板代碼。我有幾類,例如帶RESTeasy工廠的JAX-RS

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\"}"; 
    } 

我將不得不重複相同的代碼對每個I具有類。有人評論過使用工廠類來避免這種情況,可能使用泛型或接口。我很難搞清楚。請提出一個好的設計來解決這個問題。

回答

2

你必須問自己,所有實現之間的區別是什麼。 在這種情況下,並不多。您可以複製/粘貼這段代碼,用@Path(「/ company」)替換@Path(「/ user」),鍵入User,並且Company和Bob的叔叔。 Em.merge()接受任何對象,所以我們並不在乎。

因此,由於@Path註釋對所有人都不同,因此可以創建一個像這樣的新Api;

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

定義了此REST服務特有的所有元素。我們有我們的@Path和用戶作爲通用類型傳遞。

現在我們創建這個AbstractCrudApi抽象類。因爲我們想要實現所有未來服務的通用邏輯。正如你所知,接口不能實現方法。 (讓我們忘掉的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響應狀態以及響應主體。你也可以嘗試使用傑克遜來組織你的迴應對象。檢查resteasy-jackson2-provider

+0

謝謝..只是一個簡單的問題,爲什麼我必須用'@ Produces'註釋'AbstractCrudApi '? – pnyota

+0

我想,默認情況下,所有響應類型都是JSON。所以我將它添加到'AbstractCrudApi'中,所以你不需要重複自己。 –