Concrete transformation class

import org.springframework.core.convert.converter.Converter; public class ControlConverter implements Converter<String, Control> { @Override public Control convert(String s) { JSONObject jsonObject = JSONObject.parseObject(s); Control control = new Control(); control.setDeviceID(jsonObject.getString("deviceID")); control.setDeviceType(jsonObject.getInteger("deviceType")); control.setManufactureCode(jsonObject.getString("manufactureCode")); String commandName = jsonObject.getString("commandName"); JSONObject commandJson = jsonObject.getJSONObject("t"); Command t = null; if ("HornCommand".equals(commandName)) { t = commandJson.toJavaObject(HornCommand.class); } if ("ScreenCommand".equals(commandName)) { t = commandJson.toJavaObject(ScreenCommand.class); } if ("LiftCommand".equals(commandName)) { t = commandJson.toJavaObject(LiftCommand.class); } if ("BarrierCommand".equals(commandName)) { t = commandJson.toJavaObject(BarrierCommand.class); } control.setT(t); return control; }}Copy the code

Annotations that identify the specified method

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ConvertInterface {
}
Copy the code

Method parameter conversion entry

public class MethodArgumentResolver implements HandlerMethodArgumentResolver { Map<String, Converter> converters = new ConcurrentHashMap<>(); public void addConverters(String name, Converter converter) { converters.put(name, converter); } @Override public boolean supportsParameter(MethodParameter methodParameter) { ConvertInterface convertInterface = methodParameter.getParameterAnnotation(ConvertInterface.class); return convertInterface ! = null; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); Method method = (Method) parameter.getMember(); Class[] classes = method.getParameterTypes(); String param = resolveRequestBody(request); Converter converter = converters.get(classes[0].getName()); if (converter == null) { return null; } return converter.convert(param); } private String resolveRequestBody(ServletRequest request) { BufferedReader reader = null; try { reader = request.getReader(); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) ! = null) { sb.append(line); } return sb.toString(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader ! = null) { try { reader.close(); } catch (IOException e) { } } } return null; }}Copy the code

Configure the method parameter conversion class

@Bean public WebMvcConfigurer WebMvcConfigurer() { return new WebMvcConfigurer() { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { MethodArgumentResolver methodArgumentResolver = new MethodArgumentResolver(); methodArgumentResolver.addConverters(Control.class.getName(), new ControlConverter()); resolvers.add(methodArgumentResolver); }}; }Copy the code