Sebastien Deleuze
10 years ago
8 changed files with 297 additions and 24 deletions
@ -0,0 +1,70 @@
@@ -0,0 +1,70 @@
|
||||
/* |
||||
* Copyright 2002-2015 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.http.converter.json; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
|
||||
import org.springframework.http.HttpHeaders; |
||||
import org.springframework.http.HttpInputMessage; |
||||
|
||||
/** |
||||
* {@link HttpInputMessage} that can eventually stores a Jackson view that will be used |
||||
* to deserialize the message. |
||||
* |
||||
* @author Sebastien Deleuze |
||||
* @since 4.2 |
||||
*/ |
||||
public class MappingJacksonInputMessage implements HttpInputMessage { |
||||
|
||||
private final InputStream body; |
||||
|
||||
private final HttpHeaders headers; |
||||
|
||||
private Class<?> deserializationView; |
||||
|
||||
|
||||
public MappingJacksonInputMessage(InputStream body, HttpHeaders headers) { |
||||
this.body = body; |
||||
this.headers = headers; |
||||
} |
||||
|
||||
public MappingJacksonInputMessage(InputStream body, HttpHeaders headers, Class<?> deserializationView) { |
||||
this(body, headers); |
||||
this.deserializationView = deserializationView; |
||||
} |
||||
|
||||
|
||||
public void setDeserializationView(Class<?> deserializationView) { |
||||
this.deserializationView = deserializationView; |
||||
} |
||||
|
||||
public Class<?> getDeserializationView() { |
||||
return deserializationView; |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getBody() throws IOException { |
||||
return this.body; |
||||
} |
||||
|
||||
@Override |
||||
public HttpHeaders getHeaders() { |
||||
return this.headers; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,70 @@
@@ -0,0 +1,70 @@
|
||||
/* |
||||
* Copyright 2002-2015 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.servlet.mvc.method.annotation; |
||||
|
||||
import java.io.IOException; |
||||
import java.lang.reflect.Type; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonView; |
||||
|
||||
import org.springframework.core.MethodParameter; |
||||
import org.springframework.http.HttpInputMessage; |
||||
import org.springframework.http.converter.HttpMessageConverter; |
||||
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; |
||||
import org.springframework.http.converter.json.MappingJacksonInputMessage; |
||||
|
||||
/** |
||||
* A {@code RequestBodyAdvice} implementation that adds support for |
||||
* Jackson's {@code @JsonView} annotation declared on a Spring MVC |
||||
* {@code @HttpEntity} and {@code @RequestBody} method parameters. |
||||
* |
||||
* <p>The deserialization view specified in the annotation will be passed in to |
||||
* the {@code MappingJackson2HttpMessageConverter} which will then use it to |
||||
* deserialize the request body with. |
||||
* |
||||
* <p>Note that despite {@code @JsonView} allowing for more than one class to |
||||
* be specified, the use for a request body advice is only supported with |
||||
* exactly one class argument. Consider the use of a composite interface. |
||||
* |
||||
* <p>Jackson 2.5.0 or later is required. |
||||
* |
||||
* @author Sebastien Deleuze |
||||
* @since 4.2 |
||||
* @see com.fasterxml.jackson.databind.ObjectMapper#readerWithView(Class) |
||||
*/ |
||||
public class JsonViewRequestBodyAdvice extends RequestBodyAdviceAdapter { |
||||
|
||||
@Override |
||||
public boolean supports(MethodParameter methodParameter, Type targetType, |
||||
Class<? extends HttpMessageConverter<?>> converterType) { |
||||
return (AbstractJackson2HttpMessageConverter.class.isAssignableFrom(converterType) && |
||||
methodParameter.getParameterAnnotation(JsonView.class) != null); |
||||
} |
||||
|
||||
@Override |
||||
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter, |
||||
Type targetType, Class<? extends HttpMessageConverter<?>> selectedConverterType) throws IOException { |
||||
JsonView annotation = methodParameter.getParameterAnnotation(JsonView.class); |
||||
Class<?>[] classes = annotation.value(); |
||||
if (classes.length != 1) { |
||||
throw new IllegalArgumentException( |
||||
"@JsonView only supported for request body advice with exactly 1 class argument: " + methodParameter); |
||||
} |
||||
return new MappingJacksonInputMessage(inputMessage.getBody(), inputMessage.getHeaders(), classes[0]); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue