2013-02-23 62 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)构造函数。

相关问题