【发布时间】:2015-03-15 14:02:57
【问题描述】:
我有一些 Java REST ws 处理来自简单 HTML 表单的 POST 数据。 我想让客户端代码向 ws 发送正确的 JSON,以使服务器代码以正确的方式填充我的对象。
我有以下数据结构:
public class CarDTO
{
String id;
String defaultName;
List<CarCategoryDTO> carCategoryDTOs;
List<CarTranslationsDTO> carTranslationsDTOs;
/* getter, setter, constructors*/
}
public class CarCategoryDTO
{
String id;
String defaultName;
/* getter, setter, constructors*/
}
public class CarTranslationsDTO
{
int id;
String name;
LanguageDTO languageDTO;
/* getter, setter, constructors*/
}
public class LanguageDTO
{
String code;
/* getter, setter, constructors*/
}
POST 动作:
@POST
@Path("/save")
public Response saveCar(String args)
{
try
{
Gson g = new GsonBuilder().create();
CarDTO carDTO = g.fromJson(args, CarDTO.class);
System.out.println(carDTO);
return Response.ok(g.toJson(carDTO)).build();
} catch (Exception e) {
e.printStackTrace();
return Response.serverError().build();
}
}
客户端代码:
<form id="form_car"
enctype="application/json"
action="http://www.someurl.com:8080/rest/0.1/car/save"
method="POST">
<input type="text" name="defaultName" />
<input type="hidden" name="carTranslationsDTOs[0][languageDTO][code]" value='en'>
<input type="text" name="carTranslationsDTOs[0][name]">
<input type="text" name="carCategoryDTOs[0][defaultName]" value="cat1">
<input id="submitbutton" type="button" value="Salva"/>
</form>
<script>
jQuery("#submitbutton").click(function(){
var formData = JSON.stringify(jQuery("#form_car").serializeObject());
jQuery.ajax({
url: "http://www.someurl.com:8080/rest/0.1/car/save",
type:"POST",
data:formData,
contentType:"application/json; charset=utf-8",
dataType:"json",
success: function(data){
console.log(data);
}
});
});
</script>
我还添加了以下 jQuery 扩展,但还不够:jquery.serializeObject.js
问题在于参数集合的映射,结果是我只能填充 CarDTO.id 和 CarDTO.defaultName。 我怎样才能让它发挥作用?
编辑 25/03/2015:
我想解决我的问题的最简单方法是在提交时从 javascript 手动生成 json,这并不能让我满意,因为很多逻辑都是客户端的,并且将我所有的 DTO 结构暴露在这种方式很糟糕。 我不知道 Gson 中有任何自定义反序列化,我认为这是正确的路径。
任何其他帮助和不同意见都可以接受。
【问题讨论】:
-
可以提供formdata吗?
-
它已经存在,HTML + Javascript
-
我说的是 stringify 语句的输出。这样就可以将其与类映射联系起来。
-
你有很多库可以以你想要的方式将表单序列化为 JSON,看看github.com/marioizquierdo/jquery.serializeJSON、github.com/tborychowski/formparams 等。
标签: java javascript html json gson