Http Post with request content type form not working in Spring MVC 3

后端 未结 7 1582
旧时难觅i
旧时难觅i 2020-12-02 11:13

code snippet:

@RequestMapping(method = RequestMethod.POST)//,  headers = \"content-type=application/x-www-form-urlencoded\")
public ModelAndView create(@Req         


        
7条回答
  •  不思量自难忘°
    2020-12-02 11:54

    At the heart of the problem, we wish to accept both application/json and application/x-www-form-urlencoded Content-types with the same request handler.

    To do this, I use the @RequestBody, which was already working for application/json for me (and generally others from the threads I've found, but there is extra work so application/x-www-form-urlencoded can be used with @RequestBody.

    First, create a new HttpMessageConverter capable of changing the request input to an object. I do this by reusing the FormHttpMessageConverter, which is already capable of changing the input to a MultiValueMap. I then change the MultiValueMap to a regular Map, and use Jackson to turn the Map to the desired object.

    Here is the code for the HttpMessageConverter:

    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.http.HttpInputMessage;
    import org.springframework.http.HttpOutputMessage;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.FormHttpMessageConverter;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.converter.HttpMessageNotReadableException;
    import org.springframework.util.LinkedMultiValueMap;
    import org.springframework.util.MultiValueMap;
    
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 

    Converts HTTP requests with bodies that are application/x-www-form-urlencoded or multipart/form-data to an Object * annotated with {@link org.springframework.web.bind.annotation.RequestBody} in the the handler method. * * @author Jesse Swidler */ public class ObjectHttpMessageConverter implements HttpMessageConverter { private final FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter(); private final ObjectMapper objectMapper = new ObjectMapper(); private static final LinkedMultiValueMap LINKED_MULTI_VALUE_MAP = new LinkedMultiValueMap<>(); private static final Class> LINKED_MULTI_VALUE_MAP_CLASS = (Class>) LINKED_MULTI_VALUE_MAP.getClass(); @Override public boolean canRead(Class clazz, MediaType mediaType) { return objectMapper.canSerialize(clazz) && formHttpMessageConverter.canRead(MultiValueMap.class, mediaType); } @Override public boolean canWrite(Class clazz, MediaType mediaType) { return false; } @Override public List getSupportedMediaTypes() { return formHttpMessageConverter.getSupportedMediaTypes(); } @Override public Object read(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { Map input = formHttpMessageConverter.read(LINKED_MULTI_VALUE_MAP_CLASS, inputMessage).toSingleValueMap(); return objectMapper.convertValue(input, clazz); } @Override public void write(Object o, MediaType contentType, HttpOutputMessage outputMessage) throws UnsupportedOperationException { throw new UnsupportedOperationException(""); } }

    There are many different ways a Spring app might pick up that message converter. For me, it was accomplished in an XML file:

    
        
            
        
    
    

    提交回复
    热议问题