- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个连接到我开发的 REST API 的 android 应用程序。我使用 Jersey
和 Hibernate
开发了 REST API。在此 API 中,我有一个名为 findPatientById
的方法。下面是它的代码....
休息电话----
@GET
@Path("/findPatientById/{idPatient}")
@Produces(MediaType.APPLICATION_JSON)
public Patient findPatientById(@PathParam("idPatient")int idPatient){
PatientService patientService = new PatientService();
Patient patient = patientService.findPatientById(idPatient);
return patient;
}
数据库层---
public Patient findPatientById(int idPatient, Session session) {
Patient patient = (Patient) session.get(Patient.class, idPatient);
return patient;
}
服务层----
public Patient findPatientById(int idPatient) {
Session session = patientDAOInterface.openCurrentSession();
Transaction transaction = null;
Patient patient = new Patient();
try {
transaction = patientDAOInterface.openTransaction(session);
patient = patientDAOInterface.findPatientById(idPatient, session);
System.out.println("DATE CREATED - "+patient.getDateCreated());
transaction.commit();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
session.close();
Language language = new Language();
if (patient.getLanguage() != null) {
Integer idlanguage = patient.getLanguage().getIdlanguage();
language.setIdlanguage(idlanguage);
patient.setLanguage(language);
}
if (patient.getDiabetesType() != null) {
DiabetesType diabetesType = new DiabetesType();
Integer iddiabetesType = patient.getDiabetesType().getIddiabetesType();
diabetesType.setIddiabetesType(iddiabetesType);
patient.setDiabetesType(diabetesType);
}
// patient.setDateCreated(null);
// patient.setLastUpdated(null);
}
return patient;
}
下面是Patient Bean
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class Patient implements java.io.Serializable {
private Integer idpatient;
private DiabetesType diabetesType;
private Language language;
private String customId;
private String diabetesOther;
private String firstName;
private String lastName;
private String email;
private Date dob;
private String parentEmail;
private String gender;
private Date diagnosedDate;
private Double height;
private Double weight;
private String heightUnit;
private String weightUnit;
private String theme;
private String userName;
private String password;
private Date dateCreated;
private Date lastUpdated;
public Patient() {
}
public Patient(DiabetesType diabetesType, Language language, String customId, String firstName, String email, Date dob, String gender, String theme, String userName, String password, Date lastUpdated) {
this.diabetesType = diabetesType;
this.language = language;
this.customId = customId;
this.firstName = firstName;
this.email = email;
this.dob = dob;
this.gender = gender;
this.theme = theme;
this.userName = userName;
this.password = password;
this.lastUpdated = lastUpdated;
}
public Patient(DiabetesType diabetesType, Language language, String customId, String diabetesOther, String firstName, String lastName, String email, Date dob, String parentEmail, String gender, Date diagnosedDate, Double height, Double weight, String heightUnit, String weightUnit, String theme, String userName, String password, Date dateCreated, Date lastUpdated) {
this.diabetesType = diabetesType;
this.language = language;
this.customId = customId;
this.diabetesOther = diabetesOther;
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.dob = dob;
this.parentEmail = parentEmail;
this.gender = gender;
this.diagnosedDate = diagnosedDate;
this.height = height;
this.weight = weight;
this.heightUnit = heightUnit;
this.weightUnit = weightUnit;
this.theme = theme;
this.userName = userName;
this.password = password;
this.dateCreated = dateCreated;
this.lastUpdated = lastUpdated;
}
public Integer getIdpatient() {
return this.idpatient;
}
public void setIdpatient(Integer idpatient) {
this.idpatient = idpatient;
}
public DiabetesType getDiabetesType() {
return this.diabetesType;
}
public void setDiabetesType(DiabetesType diabetesType) {
this.diabetesType = diabetesType;
}
public Language getLanguage() {
return this.language;
}
public void setLanguage(Language language) {
this.language = language;
}
public String getCustomId() {
return this.customId;
}
public void setCustomId(String customId) {
this.customId = customId;
}
public String getDiabetesOther() {
return this.diabetesOther;
}
public void setDiabetesOther(String diabetesOther) {
this.diabetesOther = diabetesOther;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getDob() {
return this.dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
public String getParentEmail() {
return this.parentEmail;
}
public void setParentEmail(String parentEmail) {
this.parentEmail = parentEmail;
}
public String getGender() {
return this.gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getDiagnosedDate() {
return this.diagnosedDate;
}
public void setDiagnosedDate(Date diagnosedDate) {
this.diagnosedDate = diagnosedDate;
}
public Double getHeight() {
return this.height;
}
public void setHeight(Double height) {
this.height = height;
}
public Double getWeight() {
return this.weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public String getHeightUnit() {
return this.heightUnit;
}
public void setHeightUnit(String heightUnit) {
this.heightUnit = heightUnit;
}
public String getWeightUnit() {
return this.weightUnit;
}
public void setWeightUnit(String weightUnit) {
this.weightUnit = weightUnit;
}
public String getTheme() {
return this.theme;
}
public void setTheme(String theme) {
this.theme = theme;
}
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getDateCreated() {
return this.dateCreated;
}
public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
public Date getLastUpdated() {
return this.lastUpdated;
}
public void setLastUpdated(Date lastUpdated) {
this.lastUpdated = lastUpdated;
}
}
好的,当我调用此 REST 方法时,我得到以下 JSON
输出。
{
"idpatient": 86,
"diabetesType": null,
"language": null,
"customId": "CUS790",
"diabetesOther": null,
"firstName": "Nirodha",
"lastName": "Wije",
"email": "ni00@gmail.com",
"dob": "2005-10-16",
"parentEmail": "niaasa500@gmail.com",
"gender": "male",
"diagnosedDate": "2016-11-16",
"height": 0,
"weight": 0,
"heightUnit": null,
"weightUnit": null,
"theme": "Lite",
"userName": "ranja",
"password": "N1YL3+M0lnORHnKk0dPN8HYd1IBhWKAGO9Qsop7POgw=",
"dateCreated": 1479311638000,
"lastUpdated": 1479311638000
}
现在,我正在从我的 android 应用程序连接上述方法,我正在使用 Retrofit
来处理 REST API 工作。下面是相关的android代码...
private Patient restcallGetPatient(int idPatient){
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class, new DateTypeDeserializer());
Gson gson = gsonBuilder.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(RestCommon.URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
PatientEndPoint endPoint = retrofit.create(PatientEndPoint.class);
Call<Patient> call = endPoint.findPatientById(idPatient);
call.enqueue(new Callback<Patient>() {
@Override
public void onResponse(Response<Patient> response, Retrofit retrofit) {
patients=response.body();
Log.d("PROFILE_USER"," PATIENT_DETAILS "+patients.getFirstName());
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
Log.d("PROFILE_USER"," PATIENT_ERROR "+t.getMessage());
}
});
return patients;
}
我正在使用特定的 GSON 转换器来转换从 REST 调用中获取的 Date
和 TimeStamp
对象。我在上面的 Retrofit
代码中使用了它。它在下面。
public class DateTypeDeserializer implements JsonDeserializer<Date> {
private String[] DATE_FORMATS = new String[]{
"yyyy-MM-dd'T'HH:mm:ssZ",
"yyyy-MM-dd'T'HH:mm:ss",
"yyyy-MM-dd",
"EEE MMM dd HH:mm:ss z yyyy",
"HH:mm:ss",
"MM/dd/yyyy HH:mm:ss aaa",
"yyyy-MM-dd'T'HH:mm:ss.SSSSSS",
"yyyy-MM-dd'T'HH:mm:ss.SSSSSSS",
"yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'",
"MMM d',' yyyy H:mm:ss a"
};
@Override
public Date deserialize(JsonElement jsonElement, Type typeOF, JsonDeserializationContext context) throws JsonParseException {
for (String format : DATE_FORMATS) {
try {
return new SimpleDateFormat(format, Locale.US).parse(jsonElement.getAsString());
} catch (ParseException e) {
}
}
throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
+ "\". Supported formats: \n" + Arrays.toString(DATE_FORMATS));
}
}
现在,当我执行此 android 代码时,出现以下异常。
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: com.google.gson.JsonParseException: Unparseable date: "1479317839000". Supported formats:
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: [yyyy-MM-dd'T'HH:mm:ssZ, yyyy-MM-dd'T'HH:mm:ss, yyyy-MM-dd, EEE MMM dd HH:mm:ss z yyyy, HH:mm:ss, MM/dd/yyyy HH:mm:ss aaa, yyyy-MM-dd'T'HH:mm:ss.SSSSSS, yyyy-MM-dd'T'HH:mm:ss.SSSSSSS, yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z', MMM d',' yyyy H:mm:ss a]
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at xxx.com.au.xyz.activities.ProfileUserActivity$DateTypeDeserializer.deserialize(ProfileUserActivity.java:474)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at xxx.com.au.xyz.activities.ProfileUserActivity$DateTypeDeserializer.deserialize(ProfileUserActivity.java:451)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:103)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at com.google.gson.Gson.fromJson(Gson.java:810)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at com.google.gson.Gson.fromJson(Gson.java:775)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at retrofit.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:36)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at retrofit.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:24)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:148)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at retrofit.OkHttpCall.access$100(OkHttpCall.java:29)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at retrofit.OkHttpCall$1.onResponse(OkHttpCall.java:94)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:168)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
11-16 17:37:42.033 6534-6534/xxx.com.au.xyz W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-16 17:37:42.043 6534-6534/xxx.com.au.xyz W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-16 17:37:42.043 6534-6534/xxx.com.au.xyz W/System.err: at java.lang.Thread.run(Thread.java:818)
11-16 17:37:42.043 6534-6534/xxx.com.au.xyz D/PROFILE_USER: PATIENT_ERROR Unparseable date: "1479317839000". Supported formats:
[yyyy-MM-dd'T'HH:mm:ssZ, yyyy-MM-dd'T'HH:mm:ss, yyyy-MM-dd, EEE MMM dd HH:mm:ss z yyyy, HH:mm:ss, MM/dd/yyyy HH:mm:ss aaa, yyyy-MM-dd'T'HH:mm:ss.SSSSSS, yyyy-MM-dd'T'HH:mm:ss.SSSSSSS, yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z', MMM d',' yyyy H:mm:ss a]
11-16 17:37:42.053 6534-6534/xxx.com.au.xyz I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@b3857a0 time:13147437
好的,现在有非常重要的事情需要注意。它们在下面。
Patient
bean 中的lastUpdated
和dateCreated
是数据库中的Timestamp
。在 NetBeans 中,我为 Hibernate
自动生成 POJO,它们在 bean 中创建为 java.util.Date
。 dob
是数据库和 bean 中的 Date
对象。
我正在使用 Mysql 数据库。
因此,由于上述异常,我不可能在 Android 应用程序中使用 REST 调用从数据库中检索 bean。我很确定这是由于 2 种不同的 date
格式导致 rest 调用返回,但这应该被处理,这就是我应用自定义 GSON
转换器的原因。但没用,我得到了同样的异常(exception)。我研究了许多解决方案,这些解决方案建议以各种方式构建自定义 GSON 转换器,但仍然没有用。
我该如何解决这个问题?
最佳答案
您可以尝试将 JSON 值转换为 Long 并在方法 deserialize()
中所有日期格式失败后返回 new Date(valueAsLong)
:
代替
throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
+ "\". Supported formats: \n" + Arrays.toString(DATE_FORMATS));
写
try {
return new Date(jsonElement.getAsLong());
} catch (ClassCastException e) {
throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
+ "\". Supported formats: \n" + Arrays.toString(DATE_FORMATS));
}
但我认为问题出在服务器端。它不应返回以毫秒为单位的日期。
关于java - "JsonParseException: Unparseable date:"- 安卓错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40647335/
我想将 EditText 始终设置为 LTR,我该怎么做?android:textDirection 似乎确实是答案,我无法让项目使用该指令进行编译 最佳答案 为 editText 使用引力 andr
我希望我的应用在每次打开时都显示登录屏幕。使用 android:clearTaskOnLaunch="true" 一切正常。但是有一个错误,只有在手机关机并且应用程序首先使用小部件启动时才会发生。 I
实际上我的要求是我想将动态文件加载到像图像一样的网页中。视频,音频等,它来自 Assets 或应用程序自己的文件目录,这不是问题。 我尝试使用以下两种方式。 方式一 这是我的 html 文件在 ass
我正在触发一个 DatePickerDialog,在 api 22 (Android 5.1) 之前它一直在工作并显示良好,我在上面设置混合和最大日期(最小 = 当前日期,最大 = 从当前日期开始的
我有一个 ListView ,我在其中将标题 View 添加到该列表。一切都很好,但是当滚动列表 headerview 也随着列表移动时,所以我想避免 headerview 滚动,我的意思是当我列表到
虽然我在android上做过一些app,但我还是一头雾水。是否可以使用 SDK 4.0 中的功能,并在 android 2.1 或更低版本上运行该应用程序? 我尝试了你们提到的方法,但出现错误 - F
您好,我正在开发小型 android 应用程序,我想在其中显示带有一些元素的简单 gridview。它工作正常。唯一的问题是即使有空间,它也总是只显示两列。它平均将屏幕分成 2 列并仅显示两个元素。如
我正在使用 Android 2.3.3 API 构建一个应用程序。我需要识别方向的变化并执行一些操作。所以我在 Android Manifest 中添加了以下内容, android:configCha
我正在尝试在“点击”包含特定 MIME 类型的 nfc 标签时开始一项 Activity 。我制作了一个 mime 类型为“text/plain”的标签,并将其添加到 list 中:
我可以将一些数据保存到文件中 val byteArrayOutputStream = ByteArrayOutputStream() byteArrayOutputStream.wri
我正在尝试解析一个包含复杂阿拉伯字母的 XML 文件.. 当我在 android 2.3.7 上测试时,并不是所有的阿拉伯字母都被支持,仍然有一些复杂的显示为方 block .. 但是在 androi
我需要编写一个方法来确定设备是平板电脑还是手机。我不需要根据这个显示不同的用户界面。我只需要有关设备的信息,以便将来我可以将其发送到指标。 在互联网上,我找到了很多方法来确定设备是否是平板电脑。我已经
我正在玩文字转语音,让我的测试应用程序更有趣。它适用于模拟器,但不适用于我的手机,因为我的默认语言环境不是英语。 但是,文本是英文的,所以 tts 当然应该使用英文。据我所知,我可以实现一个自动安装,
我正在使用 MVVM 和整洁的架构编写应用程序。在其中一个屏幕上,我需要使用 pagination 实现 RecyclerView。我将使用库 Paging3。 Android 开发者推荐在存储库层使
这个问题在这里已经有了答案: I lost my .keystore file? (12 个回答) 4年前关闭。 当我以前的操作系统损坏并安装新的(7 月 3 日)时,以前的 android_key_
我正在使用 MVVM 和整洁的架构编写应用程序。在其中一个屏幕上,我需要使用 pagination 实现 RecyclerView。我将使用库 Paging3。 Android 开发者推荐在存储库层使
在我的 v27\style.xml 中,我有以下代码来设置白色导航栏: @color/colorPrimary @color/colorPrimaryDark @color/
我想通过发送电子邮件 startActivity(Intent.createChooser(new Intent(android.content.Intent.ACTION_SEND))) 我知道要将
我实现了一个自定义 ListView ,它看起来像 Twitter 时间线。 adapter = new MyClickableListAdapter(this, R.layout.timeline,
我有一个显示启动画面的自定义对话框; mSplashDialog = new Dialog(MyActivity.this,R.layout.splash); mSplashDialog.setCon
我是一名优秀的程序员,十分优秀!