求助,我想优化这段请求代码,请问如何实现?

感觉从Map中取出值赋给对象这个步骤代码冗余

不过不知道怎么优化?

@RequestMapping(value = "/v1/update/tmPara", method={ RequestMethod.POST })
    public ResponseResult updateTmParaV1 (
            HttpServletRequest request,
            @RequestBody Map<String, Object> tmDdDicSetMap
    ) {
        String code = "200";
        String message = "SUCCESS";
        ResponseResult responseResult = new ResponseResult();
        TmPara tmPara = new TmPara();
//        System.out.println(tmDdDicSetMap);

        tmPara.setParId(String.valueOf(tmDdDicSetMap.get("parId")));
        tmPara.setParNam(String.valueOf(tmDdDicSetMap.get("parNam")));
        tmPara.setParVal(String.valueOf(tmDdDicSetMap.get("parVal")));
        tmPara.setRemark(String.valueOf(tmDdDicSetMap.get("remark")));
        tmPara.setRecStaDat(String.valueOf(tmDdDicSetMap.get("recStaDat")));
        tmPara.setRecStpFlg(String.valueOf(tmDdDicSetMap.get("recStpFlg")));
        tmPara.setRecStpDat(String.valueOf(tmDdDicSetMap.get("recStpDat")));
        tmPara.setRecSta(String.valueOf(tmDdDicSetMap.get("recSta")));
        tmPara.setBusSta(String.valueOf(tmDdDicSetMap.get("busSta")));

        int tmParaUpdateFlag = tmParaService.updateTmParaV1(tmPara);
//        System.out.println("tmParaUpdateFlag == " + tmParaUpdateFlag);

        if(tmParaUpdateFlag < 1) {
            code = "500";
            message = "FAIL";
        } else {
            responseResult.setData(tmPara);
        }

        responseResult.setCode(code);
        responseResult.setMessage(message);
        return responseResult;
    }
阅读 3.8k
7 个回答

既然知道冗余为啥还用 Map…
直接把 @RequestBody Map<String, Object> 换成 @RequestBody TmPara tmPara 就行了,字段名对不上加 @JsonProperty

用反射应该可以解决问题,但是性能不一定有你这么写好

你可以研究下 https://github.com/mapstruct/mapstruct

@Mapper
public interface CarMapper {

    CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );

    @Mapping(target = "seatCount", source = "numberOfSeats")
    CarDto carToCarDto(Car car);
}

其实也是有get set,只不过这个是由mapstruct在编译时自动生成


本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

@RequestBody Map<String, Object> tmDdDicSetMap ==> @RequestBody TmPara tmPara

我直接写吧
@RequestMapping(value = "/v1/update/tmPara", method={ RequestMethod.POST })
public ResponseResult updateTmParaV1 (

    HttpServletRequest request,
    @RequestBody Map<String, Object> tmDdDicSetMap

) {

final String SUCCESS_CODE = "200";
final String SUCCESS_MESSAGE = "SUCCESS";

TmPara tmPara = new TmPara();
tmPara.setParId(String.valueOf(tmDdDicSetMap.get("parId")));
tmPara.setParNam(String.valueOf(tmDdDicSetMap.get("parNam")));
tmPara.setParVal(String.valueOf(tmDdDicSetMap.get("parVal")));
tmPara.setRemark(String.valueOf(tmDdDicSetMap.get("remark")));
tmPara.setRecStaDat(String.valueOf(tmDdDicSetMap.get("recStaDat")));
tmPara.setRecStpFlg(String.valueOf(tmDdDicSetMap.get("recStpFlg")));
tmPara.setRecStpDat(String.valueOf(tmDdDicSetMap.get("recStpDat")));
tmPara.setRecSta(String.valueOf(tmDdDicSetMap.get("recSta")));
tmPara.setBusSta(String.valueOf(tmDdDicSetMap.get("busSta")));

int tmParaUpdateFlag = tmParaService.updateTmParaV1(tmPara);

ResponseResult responseResult;
try {
    responseResult = new ResponseResult();
    responseResult.setData(tmParaUpdateFlag < 1 ? null : tmPara);
    responseResult.setCode(tmParaUpdateFlag < 1 ? "500" : SUCCESS_CODE);
    responseResult.setMessage(tmParaUpdateFlag < 1 ? "FAIL" : SUCCESS_MESSAGE);
} catch (Exception e) {
    responseResult = new ResponseResult("500", "FAIL", null);
}

return responseResult;

}

这是通过反射来实现的方法。

/**
 * 将 Map 转换为指定的 Java 类对象
 *
 * @param map 要转换的 Map
 * @param beanClass 目标类的 Class 对象
 * @return 转换后的对象
 * @throws Exception 如果转换过程中发生异常
 */
public static <T> T mapToObject(Map<String, Object> map, Class<T> beanClass) throws Exception {
    if (map == null) {
        return null;
    }
    // 使用反射创建目标类的实例
    T obj = beanClass.getDeclaredConstructor().newInstance();
    // 获取目标类的所有字段
    Field[] fields = beanClass.getDeclaredFields();
    for (Field field : fields) {
        int mod = field.getModifiers();
        // 跳过静态和 final 字段
        if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
            continue;
        }
        // 设置字段可访问
        field.setAccessible(true);
        // 获取字段名
        String fieldName = field.getName();
        // 尝试从 Map 中获取对应的值,支持大小写转换
        Object value = getValueFromMap(map, fieldName);
        if (value != null) {
            // 设置字段的值
            field.set(obj, value);
        }
    }
    return obj;
}

/**
 * 从 Map 中获取对应字段的值,支持大小写转换
 *
 * @param map 要查找的 Map
 * @param fieldName 字段名
 * @return 字段的值
 */
private static Object getValueFromMap(Map<String, Object> map, String fieldName) {
    // 尝试直接获取
    Object value = map.get(fieldName);
    if (value != null) {
        return value;
    }
    // 尝试转换为 snake_case 后获取
    String snakeCaseFieldName = toSnakeCase(fieldName);
    value = map.get(snakeCaseFieldName);
    if (value != null) {
        return value;
    }
    // 尝试转换为 CamelCase 后获取
    String camelCaseFieldName = toCamelCase(snakeCaseFieldName);
    value = map.get(camelCaseFieldName);
    return value;
}

/**
 * 将 CamelCase 转换为 snake_case
 *
 * @param camelCaseName CamelCase 名称
 * @return snake_case 名称
 */
private static String toSnakeCase(String camelCaseName) {
    StringBuilder result = new StringBuilder();
    for (char c : camelCaseName.toCharArray()) {
        if (Character.isUpperCase(c)) {
            result.append("_").append(Character.toLowerCase(c));
        } else {
            result.append(c);
        }
    }
    return result.toString();
}

/**
 * 将 snake_case 转换为 CamelCase
 *
 * @param snakeCaseName snake_case 名称
 * @return CamelCase 名称
 */
private static String toCamelCase(String snakeCaseName) {
    StringBuilder result = new StringBuilder();
    boolean nextUpperCase = false;
    for (char c : snakeCaseName.toCharArray()) {
        if (c == '_') {
            nextUpperCase = true;
        } else {
            if (nextUpperCase) {
                result.append(Character.toUpperCase(c));
                nextUpperCase = false;
            } else {
                result.append(c);
            }
        }
    }
    return result.toString();
}


撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题