2013-02-23 63 views
0

我正在使用Rest-services和JPA編寫的Java啓動HTML5客戶機服務器應用程序。我有一個問題如何實現服務器端。試想一下,你有對象的情況使用Java,JPA,HTML5和REST服務時客戶機 - 服務器應用程序的體系結構

public class User { 
    private String firstName = ""; 
    private String surName = ""; 
    private Address address = ""; 
} 

public class Address { 
    private long id = 0L; 
    private String sAddress =""; 
} 

即最終實體創建/刪除/更新數據庫時,同時使用REST服務和控制器。

現在我嘗試從ui(使用jquery和ajax)插入一個新用戶到數據庫,並且我已經填充了JSON對象。但是在User-object內部有這個Address-object。有沒有什麼方法來實現/使用它,或者我應該創建新的pojos,只有基本類型,然後創建一個新的層,在這裏我填充最終的JPA實體,如User with Address-object?我希望我的英語能夠解釋這個問題。

  1. 這是一個好主意來創建一個應用程序,其中數據(JPA實體)與Web服務層和客戶端層中的對象完全相似嗎?
  2. 任何想法如何實現?
  3. 它甚至有可能在休息服務中使用自己的對象類型 - HTML5(JSON)組合,或者甚至一般?

您可以使用Netbeans 7.3輕鬆創建這類問題/應用程序。首先創建一個帶有兩個表的數據庫,創建一個項目並從DB生成Web服務,就是這樣。現在你已經有了實體,帶有門面,數據庫和項目的Web服務。

我已經問過這個與之前的示例代碼,但沒有答案: https://stackoverflow.com/questions/14936031/mapping-and-parsing-json-objects-in-ui-and-in-java

和GOR的錯誤這樣的:

WARNING: StandardWrapperValve[ServletAdaptor]: PWC1406: Servlet.service() for servlet ServletAdaptor threw exception 
org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class entity.Address] from JSON String; no single-String constructor/factory method (through reference chain: entity.User["addressAddressId"]) 
    at org.codehaus.jackson.map.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:379) 
    at org.codehaus.jackson.map.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:268) 

回答

0

這是一個好主意,創建一個應用程序,其中數據(JPA實體)與Web服務層和客戶端層中的對象完全相似嗎?

在REST風格的Web服務中,您可以調用資源上的HTTP方法。通常,HTTP-GET會獲取由URI定義的資源。所以這個請求必須被處理,數據被檢索並以響應的形式放回。如果請求是純數據檢索,則服務器和客戶端上的數據應該相似。

任何想法如何實現?

你可以在這裏使用一個DAO對象,它訪問你的持久層。

它甚至有可能在休息服務中使用自己的對象類型-HTML5(JSON)組合,或者甚至一般嗎?

REST與HTML毫不相干,它是一個服務如何工作的範例。 HTML是一種可用於與瀏覽器等客戶端交互的語言。

+0

非常感謝回答!因此,不可能在客戶端中使用地址對象,如返回JSON.stringify({0});}(user.addressAddressId.address「:$('#address')。val();});你說過:「你可以在這裏使用DAO對象,訪問你的持久層。」這是否比改變與UI類似的DB和JPA實體更好?一個新的層,很多代碼來執行和運行時間對象吃時間和內存? – Sami 2013-02-23 22:21:02

+0

使用REST您正在返回響應,當然可以包含字符串,整數,XML文件或JSON對象。 – sschrass 2013-02-23 22:25:32

+0

我認爲你完全不知道REST背後的想法。我建議先閱讀:https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm,然後決定是否要構建一個RESTful WebService。如果你喜歡REST,可以在這裏簡單看一下:http://www.vogella.com/articles/REST/article.html。 – sschrass 2013-02-23 22:31:09

0

你問如何創建一個User JPA對象(對應到USER表),其中包含一個Address對象(對應於ADDRESS表)?

如果是這樣,這裏有一些答案:

  1. 這是完全有效的做到這一點,但一些開發商和框架倡導的Web服務層和客戶層之間的抽象層。一些倡導者直接使用這些實體(例如,Rails通常使用此模型)。其他人則主張爲此使用創建特定的數據傳輸對象(例如,從現有的WSDL文件生成服務器存根)。前者的優點是減少重複;後者的優點是一層抽象,所以如果你改變你的域名,你不必改變你的Web服務層。
  2. 使用@OneToOne註釋,至少從UserAddress,以及可能還有其他方向。上面鏈接的頁面甚至使用了你的僱員地址示例。 :)

希望幫助!

+0

不,Netbeans很容易,因爲它在從數據庫創建Web服務時自動生成JPA實體。我只是問如何解決問題,當我有像用戶實體嵌套對象--->地址實體 - >地址(字符串) – Sami 2013-02-23 20:42:22

0

根據你得到的異常,你所缺少的是你Address對象的正確構造函數。你需要Address(String x)構造函數。

相關問題