我有一个Android应用程序(Spring Android + Android Annotations + Gson),它使用来自Web应用程序(Jersey + Spring + Hibernate / JPA)的REST服务。问题是我的java.util.Date属性没有被序列化:
活动(Android应用):
...
@Click(R.id.buttonLogin)
void onLoginClick() {
Student student = new Student();
student.setDateRegistration(new Date()); //Property where the problem occurs
student.setFirstName("Venilton");
student.setGender(Gender.M);
doSomethingInBackground(student);
}
@Background
void doSomethingInBackground(Student student) {
this.restClient.insert(student);
}
...
休息客户端(Android应用):
@Rest(rootUrl = "http://MY_IP:8080/restful-app",
converters = { GsonHttpMessageConverter.class })
public interface StudentRESTfulClient {
@Post("/student/insert")
Student insert(Student student);
}
Rest Server(Web App):
@Component
@Path("/student")
public class StudentRESTfulServer {
@Autowired
private StudentService studentServiceJpa;
@POST
@Path("/insert")
public Student insert(Student student) {
//student.getDateRegistration() is null! It's a problem!
Student studentResponse = null;
try {
this.studentServiceJpa.insert(student);
studentResponse = student;
} catch (Exception exception) { }
return studentResponse;
}
}
Android应用程序为REST服务执行POST对象,但当Student对象到达StudentRESTfulServer时,DateRegistration属性会丢失其值。
你能帮帮我吗?
答案 0 :(得分:3)
显然Gson不知道如何正确地序列化你的日期(有点奇怪的是它没有把任何东西扔进日志,或者它是什么?)
简单的解决方案是设置您将要使用的Gson日期格式。
为此,您需要创建自定义转换器并使用它而不是GsonHttpMessageConverter
<强> CustomHttpMessageConverter.java 强>
CustomHttpMessageConverter extends GsonHttpMessageConverter {
protected static final String DATE_FORMAT = "yyyy-MM-dd";
protected static Gson buildGson() {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setDateFormat(DATE_FORMAT);
return gsonBuilder.create();
}
public CustomHttpMessageConverter() {
super(buildGson());
}
}
然后在 REST客户端(Android应用)
中@Rest(rootUrl = "http://MY_IP:8080/restful-app",
converters = { CustomHttpMessageConverter.class })
这应该可以正常工作。
如果仍无法正常工作
然后,您可以在buildGson
方法中添加Gson所需的任何设置,例如如果需要,可以注册自定义序列化程序:
gsonBuilder.registerTypeAdapter(Date.class, new GsonDateDeSerializer());
但是您需要在JsonDeserializer
课程中实施JsonSerializer
和GsonDateDeSerializer
个接口。
对于自定义序列化/反序列化,您可以查看我的其他答案:GSON Serialize boolean to 0 or 1