springmvc4.1+hibernate和jackson2.5的配置

首先是配置spring-servlet.xml(對springmvc配置)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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.xsd
    	http://www.springframework.org/schema/context
    	http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	
	<!-- 啓動Spring的支持註解 -->
	<context:annotation-config/>
	<mvc:annotation-driven />
	
	<!-- 設置當前項目的根包 ,掃描有註解文件的包-->
	<!--
		ATTENTION!! 對於springMVC,要求配置子容器spring-servlet.xml用於配置@Controller
		所以在這裏忽略掃描Controller,特別要注意,子容器的掃描會覆蓋掉父容器springContext.xml
		的掃描配置所以在spring-servlet.xml中需要忽略掃描@Service,不然的話會覆蓋掉父容器對
		@Service的事務增強配置,導致事務無效...........................................
	-->
	<context:component-scan base-package="com"> 
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> 
	</context:component-scan>
	 
	<!-- 用於過濾靜態文件如css js jpg png等 -->
	<mvc:default-servlet-handler/>
	
	<!-- Spring MVC視圖分解器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="prefix" value="/WEB-INF/jsp/"></property>
    	<property name="suffix" value=".jsp"></property>
    </bean>
	
	<!-- ajax json -->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
        <list>
            <ref bean="mappingJacksonHttpMessageConverter" />
            <ref bean="stringHttpMessageConverter" />
        </list>
        </property>
    </bean>
    <!--  ajax json --> 
   <span style="color:#ff0000;"> <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
       		<list>
          		  <value>text/html;charset=UTF-8</value>
       	 	</list>
    	</property>
    </bean></span>
    <!-- ajax返回utf8 -->
	<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter" >
		<property name = "supportedMediaTypes">    
			<list>    
				<value>text/plain;charset=UTF-8</value>    
			</list>    
		</property>  
	</bean> 
    
<!-- <mvc:annotation-driven>
	    <mvc:message-converters register-defaults="true">
	        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
	            <property name="objectMapper">
	                <bean class="com.fasterxml.jackson.databind.ObjectMapper">
	                    <property name="serializationInclusion">
	                        <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
	                    </property>
	                </bean>
	            </property>
	        </bean>
	    </mvc:message-converters>
	</mvc:annotation-driven> 
-->

	
	<!-- SpringMVC中的上傳文件配置,在這裏配置上傳文件大小限制不夠靈活,建議使用jQuery框架來配置,這樣可以節省服務器的壓力 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="utf-8"/>
		<property name="maxUploadSize" value="10485760000"/>
		<property name="maxInMemorySize" value="40960"/>
	</bean>

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
	
	<!-- 異常處理類 
	<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="defaultErrorView">
			<value>error</value>
		</property>
		<property name="exceptionMappings">
			<props>
				<prop key="java.sql.SQLException">/error/error</prop>
				<prop key="java.lang.RuntimeException">/error/error</prop>
			</props>
		</property>
	</bean>
	-->
	
</beans>


現在想要在Controller層將一個hibernate的實體轉換爲json格式,但是如果這個實體存在外鍵關係,如果不進行@JsonManagedReference和@JsonBackReference的配置會進入死循環,如下

@Entity
@Table(name = "department", catalog = "sqlhw_company")
public class Department implements java.io.Serializable {

	// Fields

	private Integer id;
	private String DNo;
	private String DName;
	@JsonManagedReference
	private Set<Manager> managers = new HashSet<Manager>(0);
        ............
}


@Entity
@Table(name = "manager", catalog = "sqlhw_company")
public class Manager implements java.io.Serializable {

	// Fields

	private Integer id;
	@JsonBackReference
	private Department department;
        ..................
}

但是如果很多時候,我們返回一個JSON,對於需要哪些字段並不是固定的,例如我有時候我將Department轉換成JSON的時候不需要managers這個字段,但是有時候又需要,所以要寫一個過濾器


public class WriteJsonUtil {

	public WriteJsonUtil() {
	}
	
	//忽略ignoreNames的屬性
	public static String writeJSON(Object obj, String [] ignoreNames) throws IOException {
		ObjectMapper mapper = new ObjectMapper();  
		mapper.addMixIn(Object.class, PropertyFilterMixIn.class);  
		
		FilterProvider filters = new SimpleFilterProvider().
				addFilter("IgnorePropertyByName", SimpleBeanPropertyFilter.serializeAllExcept(ignoreNames));  
		
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		mapper.setDateFormat(df);
		
		ObjectWriter writer = mapper.writer(filters);  
		return writer.writeValueAsString(obj);
	}
	
	@JsonFilter("IgnorePropertyByName")  
	class PropertyFilterMixIn {}  
}

ignoreNames就是要過濾的字段


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章