首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring -如何在运行时将URL中的请求参数映射到POJO?

Spring -如何在运行时将URL中的请求参数映射到POJO?
EN

Stack Overflow用户
提问于 2018-06-02 20:54:28
回答 2查看 902关注 0票数 0

我需要知道Spring boot如何在运行时将URL中的请求参数映射到POJO。

以下是一个带有参数的示例URL

代码语言:javascript
复制
    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,依此类推。参见下面的控制器方法示例。

代码语言:javascript
复制
@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
   }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-03 19:44:15

我在this link上找到了答案。

公共静态空applyMapOntoInstance(对象实例,映射属性){

代码语言:javascript
复制
    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());
            }
        }
    }
}

我的控制器方法现在看起来像:

代码语言:javascript
复制
@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
EN

Stack Overflow用户

发布于 2018-06-03 05:37:26

手动完成此操作的两种方式: 1)我想知道在您的项目中是否有访问HttpServletRequest对象的权限。如果是这种情况,您可以使用方法request.getParameter(nameParam)来填充所需的对象。

2)使用beanutils库,使用BeanUtils.copyProperties( dest,source)方法,在控制器中使用"@RequestParam Map source“,并替换您想要填充的dest对象

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50657140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档