Introduce alias for 'value' attribute in @RequestPart

Issue: SPR-11393
This commit is contained in:
Sam Brannen 2015-05-31 16:32:45 +02:00
parent 034e0e2cf4
commit c55486d5d5
3 changed files with 24 additions and 13 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -23,6 +23,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.Converter;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -30,7 +31,9 @@ import org.springframework.web.multipart.MultipartResolver;
/** /**
* Annotation that can be used to associate the part of a "multipart/form-data" request * Annotation that can be used to associate the part of a "multipart/form-data" request
* with a method argument. Supported method argument types include {@link MultipartFile} * with a method argument.
*
* <p>Supported method argument types include {@link MultipartFile}
* in conjunction with Spring's {@link MultipartResolver} abstraction, * in conjunction with Spring's {@link MultipartResolver} abstraction,
* {@code javax.servlet.http.Part} in conjunction with Servlet 3.0 multipart requests, * {@code javax.servlet.http.Part} in conjunction with Servlet 3.0 multipart requests,
* or otherwise for any other method argument, the content of the part is passed through an * or otherwise for any other method argument, the content of the part is passed through an
@ -50,6 +53,7 @@ import org.springframework.web.multipart.MultipartResolver;
* *
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @author Arjen Poutsma * @author Arjen Poutsma
* @author Sam Brannen
* @since 3.1 * @since 3.1
* *
* @see RequestParam * @see RequestParam
@ -61,15 +65,23 @@ import org.springframework.web.multipart.MultipartResolver;
public @interface RequestPart { public @interface RequestPart {
/** /**
* The name of the part in the "multipart/form-data" request to bind to. * Alias for {@link #name}.
*/ */
@AliasFor(attribute = "name")
String value() default ""; String value() default "";
/**
* The name of the part in the "multipart/form-data" request to bind to.
* @since 4.2
*/
@AliasFor(attribute = "value")
String name() default "";
/** /**
* Whether the part is required. * Whether the part is required.
* <p>Default is {@code true}, leading to an exception thrown in case * <p>Default is {@code true}, leading to an exception being thrown
* of the part missing in the request. Switch this to {@code false} * in case the part is missing in the request. Switch this to
* if you prefer a {@code null} in case of the part missing. * {@code false} if you prefer a {@code null} if the part is missing.
*/ */
boolean required() default true; boolean required() default true;

View File

@ -188,8 +188,8 @@ public class RequestPartMethodArgumentResolver extends AbstractMessageConverterM
} }
} }
RequestPart ann = parameter.getParameterAnnotation(RequestPart.class); RequestPart requestPart = parameter.getParameterAnnotation(RequestPart.class);
boolean isRequired = ((ann == null || ann.required()) && !optional); boolean isRequired = ((requestPart == null || requestPart.required()) && !optional);
if (arg == null && isRequired) { if (arg == null && isRequired) {
throw new MissingServletRequestPartException(partName); throw new MissingServletRequestPartException(partName);
@ -209,8 +209,8 @@ public class RequestPartMethodArgumentResolver extends AbstractMessageConverterM
} }
private String getPartName(MethodParameter methodParam) { private String getPartName(MethodParameter methodParam) {
RequestPart ann = methodParam.getParameterAnnotation(RequestPart.class); RequestPart requestPart = methodParam.getParameterAnnotation(RequestPart.class);
String partName = (ann != null ? ann.value() : ""); String partName = (requestPart != null ? requestPart.name() : "");
if (partName.length() == 0) { if (partName.length() == 0) {
partName = methodParam.getParameterName(); partName = methodParam.getParameterName();
if (partName == null) { if (partName == null) {

View File

@ -179,14 +179,13 @@ public class RequestPartIntegrationTests {
} }
} }
@SuppressWarnings("unused")
@Controller @Controller
private static class RequestPartTestController { private static class RequestPartTestController {
@RequestMapping(value = "/test", method = RequestMethod.POST, consumes = { "multipart/mixed", "multipart/form-data" }) @RequestMapping(value = "/test", method = RequestMethod.POST, consumes = { "multipart/mixed", "multipart/form-data" })
public ResponseEntity<Object> create(@RequestPart("json-data") TestData testData, public ResponseEntity<Object> create(@RequestPart(name = "json-data") TestData testData,
@RequestPart("file-data") MultipartFile file, @RequestPart("file-data") MultipartFile file,
@RequestPart(value = "empty-data", required = false) TestData emptyData) { @RequestPart(name = "empty-data", required = false) TestData emptyData) {
String url = "http://localhost:8080/test/" + testData.getName() + "/" + file.getOriginalFilename(); String url = "http://localhost:8080/test/" + testData.getName() + "/" + file.getOriginalFilename();
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();