@Override public Object resolveArgument(MethodParameter param, NativeWebRequest request) throws Exception { if (request.getNativeRequest() instanceof ClientDataRequest && param.hasParameterAnnotation(PortletRequestBody.class)) { String value = param.getParameterAnnotation(PortletRequestBody.class).value(); ClientDataRequest clientDataRequest = request.getNativeRequest(ClientDataRequest.class); if (!PortletRequestBody.DEFAULT.equals(value)) { if (isMethod(clientDataRequest, RequestMethod.POST)) { String json = JSON_MAPPER.readTree(getRequestBody(clientDataRequest)).get(value).toString(); return JSON_MAPPER.readValue(json, param.getParameterType()); } else if (isMethod(clientDataRequest, RequestMethod.GET)) { return JSON_MAPPER.readValue(request.getParameter(value), param.getParameterType()); } throw new RuntimeException( MessageFormat.format( "REST Method {0} for values not supported.", clientDataRequest.getMethod())); } if (isMethod(clientDataRequest, RequestMethod.POST)) { return JSON_MAPPER.readValue(clientDataRequest.getReader(), param.getParameterType()); } throw new RuntimeException( MessageFormat.format( "REST Method {0} for body not supported.", clientDataRequest.getMethod())); } return WebArgumentResolver.UNRESOLVED; }
/** * Resolve the argument from the model or if not found instantiate it with its default if it is * available. The model attribute is then populated with request values via data binding and * optionally validated if {@code @java.validation.Valid} is present on the argument. * * @throws org.springframework.validation.BindException if data binding and validation result in * an error and the next method parameter is not of type {@link * org.springframework.validation.Errors}. * @throws Exception if WebDataBinder initialization fails. */ public final Object resolveArgument( MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest request, WebDataBinderFactory binderFactory) throws Exception { String name = parameter.getParameterAnnotation(FormModel.class).value(); Object target = (mavContainer.containsAttribute(name)) ? mavContainer.getModel().get(name) : createAttribute(name, parameter, binderFactory, request); WebDataBinder binder = binderFactory.createBinder(request, target, name); target = binder.getTarget(); if (target != null) { bindRequestParameters(mavContainer, binderFactory, binder, request, parameter); validateIfApplicable(binder, parameter); if (binder.getBindingResult().hasErrors()) { if (isBindExceptionRequired(binder, parameter)) { throw new BindException(binder.getBindingResult()); } } } target = binder.convertIfNecessary(binder.getTarget(), parameter.getParameterType()); mavContainer.addAttribute(name, target); return target; }
public Object resolveArgument( MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { RequestAttribute attr = parameter.getParameterAnnotation(RequestAttribute.class); return webRequest.getAttribute(attr.value(), WebRequest.SCOPE_REQUEST); }
@Override public boolean supportsParameter(MethodParameter parameter) { if (!parameter.hasParameterAnnotation(PathVariable.class)) { return false; } if (Map.class.isAssignableFrom(parameter.getParameterType())) { String paramName = parameter.getParameterAnnotation(PathVariable.class).value(); return StringUtils.hasText(paramName); } return true; }
/** * Creates action input parameter. * * @param methodParameter to describe * @param value used during sample invocation * @param conversionService to apply to value */ public ActionInputParameter( MethodParameter methodParameter, Object value, ConversionService conversionService) { this.methodParameter = methodParameter; this.value = value; this.requestBody = methodParameter.getParameterAnnotation(RequestBody.class); this.requestParam = methodParameter.getParameterAnnotation(RequestParam.class); this.pathVariable = methodParameter.getParameterAnnotation(PathVariable.class); this.requestHeader = methodParameter.getParameterAnnotation(RequestHeader.class); // always determine input constraints, // might be a nested property which is neither requestBody, requestParam nor pathVariable this.inputAnnotation = methodParameter.getParameterAnnotation(Input.class); if (inputAnnotation != null) { putInputConstraint(Input.MIN, Integer.MIN_VALUE, inputAnnotation.min()); putInputConstraint(Input.MAX, Integer.MAX_VALUE, inputAnnotation.max()); putInputConstraint(Input.MIN_LENGTH, Integer.MIN_VALUE, inputAnnotation.minLength()); putInputConstraint(Input.MAX_LENGTH, Integer.MAX_VALUE, inputAnnotation.maxLength()); putInputConstraint(Input.STEP, 0, inputAnnotation.step()); putInputConstraint(Input.PATTERN, "", inputAnnotation.pattern()); } this.conversionService = conversionService; this.typeDescriptor = TypeDescriptor.nested(methodParameter, 0); }
private String getPartName(MethodParameter parameter) { RequestPart annot = parameter.getParameterAnnotation(RequestPart.class); String partName = (annot != null ? annot.value() : ""); if (partName.length() == 0) { partName = parameter.getParameterName(); Assert.notNull( partName, "Request part name for argument type [" + parameter.getParameterType().getName() + "] not specified, and parameter name information not found in class file either."); } return partName; }
@Override public Object resolveArgument( final MethodParameter methodParameter, final NativeWebRequest nativeWebRequest) throws Exception { final GreetingParam greetingParam = methodParameter.getParameterAnnotation(GreetingParam.class); if (greetingParam != null) { if (nativeWebRequest.getNativeRequest() instanceof ServletRequest) { final ServletRequest request = (ServletRequest) nativeWebRequest.getNativeRequest(); return request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); } } return UNRESOLVED; }
/** * Obtains the specified {@link Annotation} on the specified {@link MethodParameter}. * * @param annotationClass the class of the {@link Annotation} to find on the {@link * MethodParameter} * @param parameter the {@link MethodParameter} to search for an {@link Annotation} * @return the {@link Annotation} that was found or null. */ private <T extends Annotation> T findMethodAnnotation( Class<T> annotationClass, MethodParameter parameter) { T annotation = parameter.getParameterAnnotation(annotationClass); if (annotation != null) { return annotation; } Annotation[] annotationsToSearch = parameter.getParameterAnnotations(); for (Annotation toSearch : annotationsToSearch) { annotation = AnnotationUtils.findAnnotation(toSearch.annotationType(), annotationClass); if (annotation != null) { return annotation; } } return null; }
private Object[] getPossibleValues( MethodParameter methodParameter, AnnotatedParameters actionDescriptor) { try { Class<?> parameterType = methodParameter.getNestedParameterType(); Object[] possibleValues; Class<?> nested; if (Enum[].class.isAssignableFrom(parameterType)) { possibleValues = parameterType.getComponentType().getEnumConstants(); } else if (Enum.class.isAssignableFrom(parameterType)) { possibleValues = parameterType.getEnumConstants(); } else if (Collection.class.isAssignableFrom(parameterType) && Enum.class.isAssignableFrom( nested = TypeDescriptor.nested(methodParameter, 1).getType())) { possibleValues = nested.getEnumConstants(); } else { Select select = methodParameter.getParameterAnnotation(Select.class); if (select != null) { Class<? extends Options> optionsClass = select.options(); Options options = optionsClass.newInstance(); // collect call values to pass to options.get List<Object> from = new ArrayList<Object>(); for (String paramName : select.args()) { AnnotatedParameter parameterValue = actionDescriptor.getAnnotatedParameter(paramName); if (parameterValue != null) { from.add(parameterValue.getCallValue()); } } Object[] args = from.toArray(); possibleValues = options.get(select.value(), args); } else { possibleValues = new Object[0]; } } return possibleValues; } catch (Exception e) { throw new RuntimeException(e); } }
@Override public void contributeMethodArgument( MethodParameter parameter, Object value, UriComponentsBuilder builder, Map<String, Object> uriVariables, ConversionService conversionService) { if (Map.class.isAssignableFrom(parameter.getParameterType())) { return; } PathVariable annot = parameter.getParameterAnnotation(PathVariable.class); String name = StringUtils.isEmpty(annot.value()) ? parameter.getParameterName() : annot.value(); if (conversionService != null) { value = conversionService.convert(value, new TypeDescriptor(parameter), STRING_TYPE_DESCRIPTOR); } uriVariables.put(name, value); }
public Object resolveArgument( MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); NoodleRequestParam requestParam = parameter.getParameterAnnotation(NoodleRequestParam.class); String input = request.getParameter(requestParam.name()); if (input != null && !input.isEmpty()) { if (logger.isDebugEnabled()) { logger.debug("resolveArgument -> input string -> " + input); } if (requestParam.type().equals("json")) { return JSON.parseObject(input, parameter.getParameterType()); } else if (requestParam.type().equals("date")) { String param = request.getParameter(parameter.getParameterName()); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = simpleDateFormat.parse(param); return date; } } else { if (logger.isDebugEnabled()) { logger.debug("resolveArgument -> input string -> null"); } Class<?> parameterType = parameter.getParameterType(); if (parameterType.getConstructors().length > 0) { return parameterType.newInstance(); } else { String className = parameterType.getCanonicalName(); Class<?> T = Class.forName(className.substring(0, className.length() - 2)); return (Object[]) Array.newInstance(T, (int) 0); } } return null; }
public boolean supportsParameter(MethodParameter methodParameter) { return methodParameter.getParameterAnnotation(CurrentUser.class) != null && methodParameter.getParameterType().equals(User.class); }
@Override protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) { Value annotation = parameter.getParameterAnnotation(Value.class); return new ExpressionValueNamedValueInfo(annotation); }
@Override public Object resolveArgument( MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest request, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest servletRequest = request.getNativeRequest(HttpServletRequest.class); assertIsMultipartRequest(servletRequest); MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(servletRequest, MultipartHttpServletRequest.class); String partName = getPartName(parameter); Object arg; if (MultipartFile.class.equals(parameter.getParameterType())) { Assert.notNull( multipartRequest, "Expected MultipartHttpServletRequest: is a MultipartResolver configured?"); arg = multipartRequest.getFile(partName); } else if (isMultipartFileCollection(parameter)) { Assert.notNull( multipartRequest, "Expected MultipartHttpServletRequest: is a MultipartResolver configured?"); arg = multipartRequest.getFiles(partName); } else if (isMultipartFileArray(parameter)) { Assert.notNull( multipartRequest, "Expected MultipartHttpServletRequest: is a MultipartResolver configured?"); List<MultipartFile> files = multipartRequest.getFiles(partName); arg = files.toArray(new MultipartFile[files.size()]); } else if ("javax.servlet.http.Part".equals(parameter.getParameterType().getName())) { assertIsMultipartRequest(servletRequest); arg = servletRequest.getPart(partName); } else if (isPartCollection(parameter)) { assertIsMultipartRequest(servletRequest); arg = new ArrayList<Object>(servletRequest.getParts()); } else if (isPartArray(parameter)) { assertIsMultipartRequest(servletRequest); arg = RequestPartResolver.resolvePart(servletRequest); } else { try { HttpInputMessage inputMessage = new RequestPartServletServerHttpRequest(servletRequest, partName); arg = readWithMessageConverters(inputMessage, parameter, parameter.getParameterType()); WebDataBinder binder = binderFactory.createBinder(request, arg, partName); if (arg != null) { validate(binder, parameter); } mavContainer.addAttribute( BindingResult.MODEL_KEY_PREFIX + partName, binder.getBindingResult()); } catch (MissingServletRequestPartException ex) { // handled below arg = null; } } RequestPart annot = parameter.getParameterAnnotation(RequestPart.class); boolean isRequired = (annot == null || annot.required()); if (arg == null && isRequired) { throw new MissingServletRequestPartException(partName); } return arg; }
public <T extends Annotation> T getAnnotation(Class<T> annotation) { return methodParameter.getParameterAnnotation(annotation); }
public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterAnnotation(RequestAttribute.class) != null; }
public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterAnnotation(NoodleRequestParam.class) != null; }
@Override protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) { PathVariable annotation = parameter.getParameterAnnotation(PathVariable.class); return new PathVariableNamedValueInfo(annotation); }
@Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterAnnotation(AuthUser.class) != null && parameter.getParameterType().equals(UserVo.class); }
private ServletRequest prepareServletRequest( Object target, NativeWebRequest request, MethodParameter parameter) { String modelPrefixName = parameter.getParameterAnnotation(FormModel.class).value(); HttpServletRequest nativeRequest = (HttpServletRequest) request.getNativeRequest(); MultipartRequest multipartRequest = WebUtils.getNativeRequest(nativeRequest, MultipartRequest.class); MockHttpServletRequest mockRequest = null; if (multipartRequest != null) { MockMultipartHttpServletRequest mockMultipartRequest = new MockMultipartHttpServletRequest(); for (MultipartFile file : multipartRequest.getFileMap().values()) { mockMultipartRequest.addFile( new MultipartFileWrapper(getNewParameterName(file.getName(), modelPrefixName), file)); } mockRequest = mockMultipartRequest; } else { mockRequest = new MockHttpServletRequest(); } for (Entry<String, String> entry : getUriTemplateVariables(request).entrySet()) { String parameterName = entry.getKey(); String value = entry.getValue(); if (isFormModelAttribute(parameterName, modelPrefixName)) { mockRequest.setParameter(getNewParameterName(parameterName, modelPrefixName), value); } } for (Object parameterEntry : nativeRequest.getParameterMap().entrySet()) { Entry<String, String[]> entry = (Entry<String, String[]>) parameterEntry; String parameterName = entry.getKey(); String[] value = entry.getValue(); if (isFormModelAttribute(parameterName, modelPrefixName)) { mockRequest.setParameter(getNewParameterName(parameterName, modelPrefixName), value); } } return mockRequest; }