Spring - как сопоставить параметры запроса в URL с POJO во время выполнения? - PullRequest
0 голосов
/ 02 июня 2018

Мне нужно знать, как Spring boot отображает параметры запроса в URL на POJO во время выполнения.

Вот пример URL с параметрами

    http://localhost:8080/api/public/properties?serviceType.in=SALE&title.contains=some text&price.greaterOrEqualThan=500&price.lessOrEqualThan=50000&propertyType.in=HOUSE&locationId.in=1,2&landSize.greaterOrEqualThan=100&landSize.lessOrEqualThan=1000&bedrooms.greaterOrEqualThan=2&bedrooms.lessOrEqualThan=5&bathrooms.greaterOrEqualThan=1&bathrooms.lessOrEqualThan=3&ageType.in=BRAND_NEW

У меня есть несколько классов Criteria, которые все расширяют класс PropertyCriteria.Чтобы привести пример, если запрос не содержит параметров, я хочу, чтобы контроллер использовал PropertyCriteria.Если запрос содержит параметр спальни, я хочу, чтобы контроллер использовал HousePropertyCriteria и так далее.См. Пример метода контроллера ниже.

@GetMapping("/public/properties")
public ResponseEntity<List<Property>> 
   getAllPropertiesNested(HttpServletRequest request) {

   if (condition1 == true) {
       EntityOnePropertyCriteria c1 = new EntityOnePropertyCriteria();
       //populate c1 using request object

   } else {
       EntityTwoPropertyCriteria c2 = new EntityTwoPropertyCriteria();
       //populate c2 using request object
   }

}

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Я нашел ответ на этой ссылке .

public static void applyMapOntoInstance (Экземпляр объекта, Свойства карты) {

    if (properties != null && !properties.isEmpty()) {
        BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(instance);
        beanWrapper.setAutoGrowNestedPaths(true);

        for (Iterator<?> iterator = properties.entrySet().iterator(); iterator.hasNext();) {
            Map.Entry<String, ?> entry = (Map.Entry<String, ?>) iterator.next();
            String propertyName = entry.getKey();
            if (beanWrapper.isWritableProperty(propertyName)) {
                beanWrapper.setPropertyValue(propertyName, entry.getValue());
            }
        }
    }
}

Мой метод контроллера теперь выглядит так:

@GetMapping("/public/properties")
@Timed
public ResponseEntity<List<Property>> getAllPropertiesNested(HttpServletRequest request) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {


    HttpHeaders headers = null;
    if (requestContains("bedrooms", request)) {

        HousePropertyCriteria housePropertyCriteria = new HousePropertyCriteria();
        applyMapOntoInstance(housePropertyCriteria, request.getParameterMap());

        Page<HouseProperty> page = housePropertyQueryService.findByCriteriaNested(housePropertyCriteria, pageable);
        headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/public/properties");
        return new ResponseEntity(page.getContent(), headers, HttpStatus.OK);

    } else {
        Page<Property> page = propertyQueryService.findByCriteriaNested(criteria, pageable);
        headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/public/properties");
        return new ResponseEntity(page.getContent(), headers, HttpStatus.OK);
    }


}
0 голосов
/ 03 июня 2018

Два способа сделать это вручную: 1) Интересно, есть ли в вашем проекте доступ к объекту HttpServletRequest.В этом случае вы можете использовать метод request.getParameter (nameParam) для заполнения нужного вам объекта.

2) Используйте библиотеку beanutils и используйте метод BeanUtils.copyProperties (dest, source) Using "@RequestParam Map source "в вашем контроллере и замена объекта dest, который вы хотите заполнить

...