I want to have parameters in controllers declared as follows:
... method(@JsonIn Bean d, @JsonIn Bean d2, String s)
or
... method(@JsonIn @RequestParam("d") Bean d, @JsonIn @RequestParam("d2") Bean d2, @RequestParam("s") String s)
and want to call such method :
?d={id:"1", value:"v"}&d2={id:"1", value:"v"}&s="s"
i tried to solve this by aspect
But logger.debug("args[i]="+args[i]); outputsCode:@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface JsonIn { } @Component @Aspect public class RepairParametersAspect { private Logger logger = Logger.getLogger(this.getClass()); /** * Метод преобразовывающий массивы нулевой длины в массивы с одним null. * * @param pjp точка соприкосновения * @return аргумента метода * @throws Throwable */ @Around("execution(@org.springframework.web.bind.annotation.RequestMapping * *(..))") public Object callMethod(ProceedingJoinPoint pjp) throws Throwable{ Object[] args = pjp.getArgs(); MethodSignature s = (MethodSignature) pjp.getSignature(); Annotation[][] pa = s.getMethod().getParameterAnnotations(); Class[] parTypes = s.getParameterTypes(); if(args!=null && args.length>0){ for(int i=0;i<args.length;i++){ if(pa[i][0].annotationType().equals(JsonIn.class)){ logger.debug("args[i]="+args[i]); logger.debug("parTypes[i]="+parTypes[i]); args[i] = SiteUtil.gson.fromJson(""+args[i], parTypes[i]); } } return pjp.proceed(args); } else { return pjp.proceed(); } } }
args[i]=Bean{key=null, value=null}
not String {id:"1", value:"v"}
can it be done by aspects? or where to look?



Reply With Quote