将请求参数转换为 Class 对象
Converting request parameters to the Class object
我有两个 POJO classes.
Class 1 是 Engine.java:
private String engineId;
public String getEngineId(){
return this.engineId;
}
public void setEngineId(String engineId){
this.engineId = engineId;
}
第二个 POJO class 是 Vehicle.java:
private String type;
private String manufacturer;
private Engine engine;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
我有一个用于提供车辆信息的 REST 控制器 (RequestMethod.GET):
@RequestMapping(method = RequestMethod.GET)
public Vehicle getVechileDetails(Vehicle inputVehicle){
Vehicle vehicle = new Vehicle();
// some processing
return vehicle;
}
当我点击此服务并提供请求参数作为类型或制造商时,Spring 会创建 Vehicle 对象并填充类型和制造商的值。但是,如果我提供 engineId 的值,则 Spring 无法创建 Engine 对象,使得 vehicle.getEngine().getEngineId() != null
有没有什么方法可以让我像这样调用我的 Rest 服务:
http://localhost:8080/Controller/getVehicleDetails?engineId=12345
然后使用值为 engineId 的 Engine 创建 Vehicle ?
你可以这样获取vehicleId(包含ResponseEntity结构):
@RequestMapping(value = "/Controller/getVehicleDetails", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public
@ResponseBody
ResponseEntity<AjaxResponse> controller(@RequestParam(value = "engineId") Long engineId) {
//Do whatever you want with the engineId
return new ResponseEntity<AjaxResponse>(new AjaxResponse("Success"), HttpStatus.OK);
}
但是,对于 POJO,我必须警告两件事:
- 确保您的 classes 实现
Serializable
- 对于从 Java 转换为 Java 脚本时不确定的字段,反之亦然,例如
Date
变量,您必须设置 JsonSerializer class正确
更新: 你想从请求中获取对象,所以:
@RequestMapping(value = "/Controller/getVehicleDetails", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, , consumes = MediaType.APPLICATION_JSON_VALUE)
public
@ResponseBody
ResponseEntity<AjaxResponse> controller(@RequestBody Vehicle vehicle) {
//vehicle.getEngine().getEngineId()
return new ResponseEntity<AjaxResponse>(new AjaxResponse("Success"), HttpStatus.OK);
}
POJOS:
public class Engine implements Serializable {
//...
}
public class Vehicle implements Serializable {
private Engine engine;
}
JS 端:
var vehicle = {
engine: {id: 123}//,
//...
}
//via angularjs:
$http.post("http://localhost:8080/Controller/getVehicleDetails", vehicle).success(function(response) {
console.log("success");
});
这里你可以参考,其中请求体有JSON转换为对象
参见:For references
@RequestMapping(value = EmpRestURIConstants.CREATE_EMP, method = RequestMethod.POST)
public @ResponseBody Employee createEmployee(@RequestBody Employee emp) {
logger.info("Start createEmployee.");
emp.setCreatedDate(new Date());
empData.put(emp.getId(), emp);
return emp;
}
我有两个 POJO classes.
Class 1 是 Engine.java:
private String engineId;
public String getEngineId(){
return this.engineId;
}
public void setEngineId(String engineId){
this.engineId = engineId;
}
第二个 POJO class 是 Vehicle.java:
private String type;
private String manufacturer;
private Engine engine;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
我有一个用于提供车辆信息的 REST 控制器 (RequestMethod.GET):
@RequestMapping(method = RequestMethod.GET)
public Vehicle getVechileDetails(Vehicle inputVehicle){
Vehicle vehicle = new Vehicle();
// some processing
return vehicle;
}
当我点击此服务并提供请求参数作为类型或制造商时,Spring 会创建 Vehicle 对象并填充类型和制造商的值。但是,如果我提供 engineId 的值,则 Spring 无法创建 Engine 对象,使得 vehicle.getEngine().getEngineId() != null
有没有什么方法可以让我像这样调用我的 Rest 服务:
http://localhost:8080/Controller/getVehicleDetails?engineId=12345
然后使用值为 engineId 的 Engine 创建 Vehicle ?
你可以这样获取vehicleId(包含ResponseEntity结构):
@RequestMapping(value = "/Controller/getVehicleDetails", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public
@ResponseBody
ResponseEntity<AjaxResponse> controller(@RequestParam(value = "engineId") Long engineId) {
//Do whatever you want with the engineId
return new ResponseEntity<AjaxResponse>(new AjaxResponse("Success"), HttpStatus.OK);
}
但是,对于 POJO,我必须警告两件事:
- 确保您的 classes 实现
Serializable
- 对于从 Java 转换为 Java 脚本时不确定的字段,反之亦然,例如
Date
变量,您必须设置 JsonSerializer class正确
更新: 你想从请求中获取对象,所以:
@RequestMapping(value = "/Controller/getVehicleDetails", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, , consumes = MediaType.APPLICATION_JSON_VALUE)
public
@ResponseBody
ResponseEntity<AjaxResponse> controller(@RequestBody Vehicle vehicle) {
//vehicle.getEngine().getEngineId()
return new ResponseEntity<AjaxResponse>(new AjaxResponse("Success"), HttpStatus.OK);
}
POJOS:
public class Engine implements Serializable {
//...
}
public class Vehicle implements Serializable {
private Engine engine;
}
JS 端:
var vehicle = {
engine: {id: 123}//,
//...
}
//via angularjs:
$http.post("http://localhost:8080/Controller/getVehicleDetails", vehicle).success(function(response) {
console.log("success");
});
这里你可以参考,其中请求体有JSON转换为对象 参见:For references
@RequestMapping(value = EmpRestURIConstants.CREATE_EMP, method = RequestMethod.POST)
public @ResponseBody Employee createEmployee(@RequestBody Employee emp) {
logger.info("Start createEmployee.");
emp.setCreatedDate(new Date());
empData.put(emp.getId(), emp);
return emp;
}