- /*
- * Copyright 2002-2004 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package org.springframework.web.bind;
- import java.util.Iterator;
- import java.util.Map;
- import javax.servlet.ServletRequest;
- import org.springframework.beans.MutablePropertyValues;
- import org.springframework.validation.DataBinder;
- import org.springframework.web.multipart.MultipartFile;
- import org.springframework.web.multipart.MultipartHttpServletRequest;
- /**
- * Use this class to perform manual data binding from servlet request
- * parameters to JavaBeans, including support for multipart files.
- * @author Rod Johnson
- * @author Juergen Hoeller
- */
- public class ServletRequestDataBinder extends DataBinder {
- private boolean bindEmptyMultipartFiles = true;
- /**
- * Create a new DataBinder instance.
- * @param target target object to bind onto
- * @param name name of the target object
- */
- public ServletRequestDataBinder(Object target, String name) {
- super(target, name);
- }
- /**
- * Set whether to bind empty MultipartFile parameters. Default is true.
- * <p>Turn this off if you want to keep an already bound MultipartFile
- * when the user resubmits the form without choosing a different file.
- * Else, the already bound MultipartFile will be replaced by an empty
- * MultipartFile holder.
- */
- public void setBindEmptyMultipartFiles(boolean bindEmptyMultipartFiles) {
- this.bindEmptyMultipartFiles = bindEmptyMultipartFiles;
- }
- /**
- * Bind the parameters of the given request to this binder's target,
- * also binding multipart files in case of a multipart request.
- * <p>This call can create field errors, representing basic binding
- * errors like a required field (code "required"), or type mismatch
- * between value and bean property (code "typeMismatch").
- * <p>Multipart files are bound via their parameter name, just like normal
- * HTTP parameters: i.e. "uploadedFile" to an "uploadedFile" bean property,
- * invoking a "setUploadedFile" setter method.
- * <p>The type of the target property for a multipart file can be MultipartFile,
- * byte[], or String. The latter two receive the contents of the uploaded file;
- * all metadata like original file name, content type, etc are lost in those cases.
- * @param request request with parameters to bind (can be multipart)
- * @see org.springframework.web.multipart.MultipartHttpServletRequest
- * @see org.springframework.web.multipart.MultipartFile
- */
- public void bind(ServletRequest request) {
- // bind normal HTTP parameters
- MutablePropertyValues pvs = new ServletRequestParameterPropertyValues(request);
- // bind multipart files
- if (request instanceof MultipartHttpServletRequest) {
- MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
- Map fileMap = multipartRequest.getFileMap();
- for (Iterator it = fileMap.keySet().iterator(); it.hasNext();) {
- String key = (String) it.next();
- MultipartFile value = (MultipartFile) fileMap.get(key);
- if (this.bindEmptyMultipartFiles || !value.isEmpty()) {
- pvs.addPropertyValue(key, value);
- }
- }
- }
- bind(pvs);
- }
- /**
- * Treats errors as fatal. Use this method only if
- * it's an error if the input isn't valid.
- * This might be appropriate if all input is from dropdowns, for example.
- * @throws ServletRequestBindingException subclass of ServletException on any binding problem
- */
- public void closeNoCatch() throws ServletRequestBindingException {
- if (getErrors().hasErrors()) {
- throw new ServletRequestBindingException("Errors binding onto object '" + getErrors().getObjectName() + "'",
- getErrors());
- }
- }
- }