Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to configure spring mvc 3 to not return "null" object in json response?

a sample of json response looks like this:

{"publicId":"123","status":null,"partner":null,"description":null} 

It would be nice to truncate out all null objects in the response. In this case, the response would become {"publicId":"123"}.

Any advice? Thanks!

P.S: I think I can do that in Jersey. Also I believe they both use Jackson as the JSON processer.

Added Later: My configuration:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:context="http://www.springframework.org/schema/context"     xsi:schemaLocation="         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">      <!-- Scans the classpath of this application for @Components to deploy as beans -->     <context:component-scan base-package="com.SomeCompany.web" />      <!-- Application Message Bundle -->     <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">         <property name="basename" value="/WEB-INF/messages/messages" />         <property name="cacheSeconds" value="0" />     </bean>      <!-- Configures Spring MVC -->     <import resource="mvc-config.xml" /> 

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:mvc="http://www.springframework.org/schema/mvc"     xsi:schemaLocation="         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">      <!-- Configures the @Controller programming model -->     <mvc:annotation-driven />      <!-- Forwards requests to the "/" resource to the "welcome" view -->     <!--<mvc:view-controller path="/" view-name="welcome"/>-->      <!-- Configures Handler Interceptors -->         <mvc:interceptors>         <!-- Changes the locale when a 'locale' request parameter is sent; e.g. /?locale=de -->         <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />     </mvc:interceptors>      <!-- Saves a locale change using a cookie -->     <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />      <!--<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">         <property name="mediaTypes">             <map>                 <entry key="atom" value="application/atom+xml"/>                 <entry key="html" value="text/html"/>                 <entry key="json" value="application/json"/>                 <entry key="xml" value="text/xml"/>             </map>         </property>         <property name="viewResolvers">             <list>                 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">                     <property name="prefix" value="/WEB-INF/views/"/>                     <property name="suffix" value=".jsp"/>                 </bean>             </list>         </property>         <property name="defaultViews">             <list>                 <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />                 <bean class="org.springframework.web.servlet.view.xml.MarshallingView" >                     <property name="marshaller">                         <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller" />                     </property>                 </bean>             </list>         </property>     </bean> -->   <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">         <property name="prefix" value="/WEB-INF/views/"/>         <property name="suffix" value=".jsp"/>     </bean> 

My code:

@Controller public class SomeController {     @RequestMapping(value = "/xyz", method = {RequestMethod.GET, RequestMethod.HEAD},     headers = {"x-requested-with=XMLHttpRequest","Accept=application/json"}, params = "!closed")     public @ResponseBody     List<AbcTO> getStuff(           .......     } } 
like image 536
Bobo Avatar asked May 18 '11 18:05

Bobo


People also ask

How do I ignore null values in JSON response spring rest?

You can ignore null fields at the class level by using @JsonInclude(Include. NON_NULL) to only include non-null fields, thus excluding any attribute whose value is null. You can also use the same annotation at the field level to instruct Jackson to ignore that field while converting Java object to json if it's null.

How do I ignore null values in post request body in spring boot?

Just use this @JsonSerialize(include = Inclusion. NON_NULL) instead of @JsonInclude(Include. NON_NULL) and it works..!!

How do you stop returning null in Java?

Another way to avoid returning null is to use a Null object design pattern. A null object is an object without behavior like a stub that a developer can return to the caller instead of returning null value. The caller doesn't need to check the order for null value because a real but empty Order object is returned.


2 Answers

Yes, you can do this for individual classes by annotating them with @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) or you can do it across the board by configuring your ObjectMapper, setting the serialization inclusion to JsonSerialize.Inclusion.NON_NULL.

Here is some info from the Jackson FAQ: http://wiki.fasterxml.com/JacksonAnnotationSerializeNulls.

Annotating the classes is straightforward, but configuring the ObjectMapper serialization config slightly trickier. There is some specific info on doing the latter here.

like image 192
BennyFlint Avatar answered Oct 07 '22 02:10

BennyFlint


Doesn't answer the question but this is the second google result.

If anybody comes here and wants do do it for Spring 4 (as it happened to me), you can use the annotation

@JsonInclude(Include.NON_NULL) 

on the returning class.

As mentioned in the comments, and in case anyone is confused, the annotation should be used in the class that will be converted to JSON.

like image 22
Mário Fernandes Avatar answered Oct 07 '22 03:10

Mário Fernandes