Преобразование параметров запроса в объект класса

У меня два класса POJO.

Класс 1 - Engine.java:

private String engineId;

public String getEngineId(){
  return this.engineId;
}   

public void setEngineId(String engineId){
  this.engineId = engineId;
}

Второй класс POJO - 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 для предоставления информации о Vechicles (RequestMethod.GET):

@RequestMapping(method = RequestMethod.GET)
public Vehicle getVechileDetails(Vehicle inputVehicle){
   Vehicle vehicle = new Vehicle();
    // some processing
    return vehicle;
}

Когда я нажимаю на эту службу и указываю параметр Request в качестве типа или производителя, Spring создает объект Vehicle и заполняет значение типа и производителя. Но если я предоставлю значение engineId, то Spring не сможет создать объект Engine так, чтобы vehicle.getEngine().getEngineId() != null

Есть ли способ, которым я вызываю свою службу отдыха, например:

http://localhost:8080/Controller/getVehicleDetails?engineId=12345

тогда Автомобиль создается с Engine, имеющим значение engineId?


person Rahul    schedule 06.02.2017    source источник
comment
Пожалуйста, добавьте конфигурацию Spring bean для обоих beans.   -  person Shivam Aggarwal    schedule 06.02.2017
comment
Почему в этом случае нам нужна конфигурация Spring Bean? Если определение bean-компонента (инжекция двигателя в автомобиль) при запуске приложения может помочь, дайте мне знать.   -  person Rahul    schedule 06.02.2017


Ответы (2)


Вы можете получить 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 я должен предупредить о двух вещах:

  1. Убедитесь, что ваши классы реализуют Serializable
  2. Для полей, которые не определены при преобразовании из Java в Javascript или наоборот, таких как переменные Date, вы должны правильно установить свой класс JsonSerializer.

Обновление: вы хотели получить объект из запроса, поэтому:

    @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");
    });
person Bahadir Tasdemir    schedule 06.02.2017
comment
Проблема не в том, как получить engineId в качестве входного параметра. Проблема в том, что я хочу, чтобы в качестве входного параметра использовался объект Vehicle, даже если пользователь обращается к службе, передавая engineId. - person Rahul; 06.02.2017
comment
Вы хотите получить его как объект из запроса? - person Bahadir Tasdemir; 06.02.2017
comment
да. Я хочу, чтобы объект Vehicle был заполнен идентификатором двигателя, чтобы: vehicle.getEngine().getEngineId() давал мне значение. - person Rahul; 06.02.2017
comment
вы изменили RequetMethod с GET на POST. :) Нужен объект Vehicle в качестве входного параметра, если тип запроса - GET. - person Rahul; 06.02.2017
comment
Если вы публикуете объект в теле запроса, вы должны установить для него POST - person Bahadir Tasdemir; 06.02.2017
comment
Я понимаю, что вы говорите. Значит, нет способа отправить объект с помощью метода Request.GET? - person Rahul; 07.02.2017
comment
Да, прочтите наш ответ: stackoverflow.com/a/13270939/1201725 и не забудьте отметить мой ответ как правильный - person Bahadir Tasdemir; 07.02.2017
comment
Спасибо. Ссылка, которую вы предоставили, помогает! - person Rahul; 07.02.2017

Здесь вы можете указать, где в теле запроса есть JSON, преобразованный в Object See: Для справки

@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;
    }
person prasanna sudharsan    schedule 06.02.2017
comment
Проблема в RequestMethod.GET. Невозможно использовать @RequestBody с GET. - person Rahul; 06.02.2017