为了创建REST风格的API,我有一个对象图,我想要转换为JSON和XML.令我感到震惊的是,某人必须已经这样做了,但是使用Google和Stack Overflow进行的快速搜索没有任何结果.
有没有人知道一个合适的(Apache或等效的许可首选)库来做到这一点?
您好我正在使用FireFox RestClient发送JSON Post请求.
我的JSON请求如下:
{ "firstName": "Test", "lastName": "1", "isActive": 1 }
Run Code Online (Sandbox Code Playgroud)
我的POJO具有isActive字段如下
private boolean isActive;
Run Code Online (Sandbox Code Playgroud)
我的控制器定义如下
@RequestMapping(method = {RequestMethod.POST,
RequestMethod.PUT}, value = "/save")
public ResponseEntity<RestResponse> save(
@RequestBody POJOUserDetails userDetails, WebRequest request){
Run Code Online (Sandbox Code Playgroud)
在我的POJO中,当我检查isActive的值时,无论发送什么,它都是假的.我在我的JSON请求中尝试了以下值
"isActive": 1
"isActive": true
"isActive": "true"
"isActive": ""
"isActive": null
"isActive": false
Run Code Online (Sandbox Code Playgroud)
以上所有都在我的控制器中发送错误.请帮忙.谢谢
添加POJO详细信息
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include=Inclusion.NON_EMPTY)
public class POJOUserDetails {
private String firstName;
private String lastName;
private boolean isActive;
public boolean isActive() {
return isActive;
}
public void setActive(boolean isActive) {
this.isActive = isActive;
} …Run Code Online (Sandbox Code Playgroud) 我在一个项目上工作,我们必须为所有简单的bean(POJO)创建单元测试.如果所有POJO都是getter和setter,那么为POJO创建单元测试是否有任何意义?假设POJO在大约100%的时间内都能正常工作,这是一个安全的假设吗?
重复 - 应该测试@Entity Pojos吗?
也可以看看
我刚刚开始使用Hibernate,到目前为止我看到的所有示例看起来都非常像Hibernate文档中的教程:
package org.hibernate.tutorial.domain;
import java.util.Date;
public class Event {
private Long id;
private String title;
private Date date;
public Event() {}
/* Accessor methods... */
}
Run Code Online (Sandbox Code Playgroud)
具体来说:没有任何字段被声明为final,并且必须有一个无参数构造函数,以便Hibernate框架可以实例化该类并设置其字段.
但事情就是这样 - 我真的不喜欢每当我能避免它时就以任何方式使我的类变得可变(Java实践:不可变对象为此做出了相当强烈的论据).那么,即使我要声明每个字段的"最终",有没有办法让Hibernate工作?
我知道Hibernate使用Reflection来实例化它的类,因此需要能够调用某种构造函数,而不会冒险选择错误的构造函数或将错误的值传递给它的一个参数,所以它可能更安全调用no-arg构造函数并一次设置一个字段.但是,是否应该可以向Hibernate提供必要的信息,以便它可以安全地实例化不可变对象?
public class Event {
private final Long id;
private final String title;
private final Date date;
public Event(@SetsProperty("id") Long id,
@SetsProperty("title") String title,
@SetsProperty("date") Date date) {
this.id = id;
this.title = title;
this.date = new Date(date.getTime());
}
/* Accessor methods... */
} …Run Code Online (Sandbox Code Playgroud) 我有一个Java类,它代表两个元素之间的相关性(典型的POJO):
public class Correlation {
private final String a;
private final String b;
private double correlation;
public Correlation(String a, String b) {
this.a = a;
this.b = b;
}
public double getCorrelation() {
return correlation;
}
public void setCorrelation(double correlation) {
this.correlation = correlation;
}
}
Run Code Online (Sandbox Code Playgroud)
如果a等于b,则遵循正确的相关逻辑,那么相关值应该始终为1.我可以添加改变getter方法的逻辑(忽略a的可能空值的事实):
public double getCorrelation() {
if (a.equals(b)) {
return 1D;
} else {
return correlation;
}
}
Run Code Online (Sandbox Code Playgroud)
困扰我的是将此逻辑添加到getter方法,如果我更改方法名称或记录它应该被认为是足够的?
我想要我的定制者,以便我可以将它们链接起来:
myPojo.setX(x).setY(y);
Run Code Online (Sandbox Code Playgroud)
通常我使用Eclipse生成setter但不幸的是code template,setter允许我只更改setter的主体,而不是签名.
什么是最简单的方法来完成上述?除了搜索和替换+手动编辑?:)
通过改造将json响应映射到pojo通常我们这样做
@POST
Call<User> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
ApiCalls api = retrofit.create(ApiCalls.class);
Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<User>() {
//Response and failure callbacks
}
Run Code Online (Sandbox Code Playgroud)
用户是我的Pojo课程.但是对于每个其他请求,我需要制作不同的pojo并为改进调用编写相同的代码.我想制作一个单独的方法来调用api并传递相应的pojo类来改进调用.像这样
ApiCalls api = retrofit.create(ApiCalls.class);
Call<*ClassPassed*> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<*ClassPassed*>() {
//Response and failure callbacks
}
Run Code Online (Sandbox Code Playgroud)
所以现在我可以将任何pojo类转换为单个方法并获得响应.这只是为了避免一次又一次地重写相同的代码.这是可能的
更新 要详细说明:
假设我需要提出两个请求.第一个是获取userDetails,另一个是patientDetails.所以我必须创建两个模型类User和Patient.所以在改造api我会有类似的东西
@POST
Call<User> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
@POST
Call<Patient> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
Run Code Online (Sandbox Code Playgroud)
在我的FragmentUser和FragmentPatient类中,我将这样做
ApiCalls api = retrofit.create(ApiCalls.class);
Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<User>() {
//Response and failure callbacks
}
ApiCalls …Run Code Online (Sandbox Code Playgroud) 我找不到它们之间的区别.有谁知道如何区分它们?
是否有可以执行以下操作的库?:
给定一个Object和一个HashMap,它枚举Hashmap的键,并在Object中查找这些键的setter并设置相关的值.看起来像这样的东西:
public Object setData(Object object, HashMap<String, Object> fields) {
for (Entry<String, Object> entry : fields.entrySet()) {
Method m = object.getClass().getMethod("set" + entry.getKey(), entry.getValue().getClass());
if (m != null) {
m.invoke(object, entry.getValue());
}
}
return object;
}
Run Code Online (Sandbox Code Playgroud)
这个任务看起来很简单,但我希望有人已经注意到了一些细微差别.如你所知,重新发明轮子(好轮子)是一种糟糕的方法.
我是Spring框架的新手.在我看到的大多数Spring教程中,Spring被描述为"非侵入性".
侵入性是什么意思?在Java中使用Spring有什么优点,是什么让它成为非侵入性的?