parent
							
								
									902a7287f7
								
							
						
					
					
						commit
						1291d6e1bd
					
				|  | @ -170,6 +170,13 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe | ||||||
| 
 | 
 | ||||||
| 		Class<?> returnValueClass = getReturnValueType(returnValue, returnType); | 		Class<?> returnValueClass = getReturnValueType(returnValue, returnType); | ||||||
| 		Type returnValueType = getGenericType(returnType); | 		Type returnValueType = getGenericType(returnType); | ||||||
|  | 
 | ||||||
|  | 		if (returnValue != null && returnValue instanceof CharSequence) { | ||||||
|  | 			returnValueClass = String.class; | ||||||
|  | 			returnValueType = String.class; | ||||||
|  | 			returnValue = (T) returnValue.toString(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		HttpServletRequest servletRequest = inputMessage.getServletRequest(); | 		HttpServletRequest servletRequest = inputMessage.getServletRequest(); | ||||||
| 		List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(servletRequest); | 		List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(servletRequest); | ||||||
| 		List<MediaType> producibleMediaTypes = getProducibleMediaTypes(servletRequest, returnValueClass, returnValueType); | 		List<MediaType> producibleMediaTypes = getProducibleMediaTypes(servletRequest, returnValueClass, returnValueType); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2015 the original author or authors. |  * Copyright 2002-2016 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. | ||||||
|  | @ -19,7 +19,6 @@ package org.springframework.web.servlet.mvc.method.annotation; | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
| import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Arrays; |  | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
|  | @ -31,7 +30,10 @@ import org.junit.Test; | ||||||
| import org.springframework.core.MethodParameter; | import org.springframework.core.MethodParameter; | ||||||
| import org.springframework.http.HttpEntity; | import org.springframework.http.HttpEntity; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
|  | import org.springframework.http.ResponseEntity; | ||||||
|  | import org.springframework.http.converter.ByteArrayHttpMessageConverter; | ||||||
| import org.springframework.http.converter.HttpMessageConverter; | import org.springframework.http.converter.HttpMessageConverter; | ||||||
|  | import org.springframework.http.converter.StringHttpMessageConverter; | ||||||
| import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | ||||||
| import org.springframework.mock.web.test.MockHttpServletRequest; | import org.springframework.mock.web.test.MockHttpServletRequest; | ||||||
| import org.springframework.mock.web.test.MockHttpServletResponse; | import org.springframework.mock.web.test.MockHttpServletResponse; | ||||||
|  | @ -45,7 +47,10 @@ import org.springframework.web.context.request.ServletWebRequest; | ||||||
| import org.springframework.web.method.HandlerMethod; | import org.springframework.web.method.HandlerMethod; | ||||||
| import org.springframework.web.method.support.ModelAndViewContainer; | import org.springframework.web.method.support.ModelAndViewContainer; | ||||||
| 
 | 
 | ||||||
| import static org.junit.Assert.*; | import static org.junit.Assert.assertEquals; | ||||||
|  | import static org.junit.Assert.assertNotNull; | ||||||
|  | import static org.junit.Assert.assertNull; | ||||||
|  | import static org.junit.Assert.assertTrue; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Test fixture with {@link HttpEntityMethodProcessor} delegating to |  * Test fixture with {@link HttpEntityMethodProcessor} delegating to | ||||||
|  | @ -182,11 +187,35 @@ public class HttpEntityMethodProcessorTests { | ||||||
| 		assertTrue(content.contains("\"type\":\"bar\"")); | 		assertTrue(content.contains("\"type\":\"bar\"")); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// SPR-13423 | ||||||
|  | 
 | ||||||
|  | 	@Test | ||||||
|  | 	public void handleReturnValueCharSequence() throws Exception { | ||||||
|  | 		List<HttpMessageConverter<?>>converters = new ArrayList<>(); | ||||||
|  | 		converters.add(new ByteArrayHttpMessageConverter()); | ||||||
|  | 		converters.add(new StringHttpMessageConverter()); | ||||||
|  | 
 | ||||||
|  | 		Method method = getClass().getDeclaredMethod("handle"); | ||||||
|  | 		MethodParameter returnType = new MethodParameter(method, -1); | ||||||
|  | 		ResponseEntity<StringBuilder> returnValue = ResponseEntity.ok(new StringBuilder("Foo")); | ||||||
|  | 
 | ||||||
|  | 		HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor(converters); | ||||||
|  | 		processor.handleReturnValue(returnValue, returnType, mavContainer, webRequest); | ||||||
|  | 
 | ||||||
|  | 		assertEquals("text/plain;charset=ISO-8859-1", servletResponse.getHeader("Content-Type")); | ||||||
|  | 		assertEquals("Foo", servletResponse.getContentAsString()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 	@SuppressWarnings("unused") | 	@SuppressWarnings("unused") | ||||||
| 	public void handle(HttpEntity<List<SimpleBean>> arg1, HttpEntity<SimpleBean> arg2) { | 	public void handle(HttpEntity<List<SimpleBean>> arg1, HttpEntity<SimpleBean> arg2) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	ResponseEntity<CharSequence> handle() { | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	@SuppressWarnings("unused") | 	@SuppressWarnings("unused") | ||||||
| 	private static abstract class MyParameterizedController<DTO extends Identifiable> { | 	private static abstract class MyParameterizedController<DTO extends Identifiable> { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2015 the original author or authors. |  * Copyright 2002-2016 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. | ||||||
|  | @ -290,6 +290,24 @@ public class RequestResponseBodyMethodProcessorTests { | ||||||
| 		assertEquals("Foo", servletResponse.getContentAsString()); | 		assertEquals("Foo", servletResponse.getContentAsString()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// SPR-13423 | ||||||
|  | 	 | ||||||
|  | 	@Test | ||||||
|  | 	public void handleReturnValueCharSequence() throws Exception { | ||||||
|  | 		List<HttpMessageConverter<?>>converters = new ArrayList<>(); | ||||||
|  | 		converters.add(new ByteArrayHttpMessageConverter()); | ||||||
|  | 		converters.add(new StringHttpMessageConverter()); | ||||||
|  | 
 | ||||||
|  | 		Method method = ResponseBodyController.class.getMethod("handleWithCharSequence"); | ||||||
|  | 		MethodParameter returnType = new MethodParameter(method, -1); | ||||||
|  | 
 | ||||||
|  | 		RequestResponseBodyMethodProcessor processor = new RequestResponseBodyMethodProcessor(converters); | ||||||
|  | 		processor.handleReturnValue(new StringBuilder("Foo"), returnType, mavContainer, webRequest); | ||||||
|  | 
 | ||||||
|  | 		assertEquals("text/plain;charset=ISO-8859-1", servletResponse.getHeader("Content-Type")); | ||||||
|  | 		assertEquals("Foo", servletResponse.getContentAsString()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void handleReturnValueStringAcceptCharset() throws Exception { | 	public void handleReturnValueStringAcceptCharset() throws Exception { | ||||||
| 		this.servletRequest.addHeader("Accept", "text/plain;charset=UTF-8"); | 		this.servletRequest.addHeader("Accept", "text/plain;charset=UTF-8"); | ||||||
|  | @ -739,6 +757,11 @@ public class RequestResponseBodyMethodProcessorTests { | ||||||
| 		public String handle() { | 		public String handle() { | ||||||
| 			return "hello"; | 			return "hello"; | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		@RequestMapping | ||||||
|  | 		public CharSequence handleWithCharSequence() { | ||||||
|  | 			return null; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue