提供一个可以解决懒加载问题的方式

      自己用的框架是(Springmvc+Spring+Hibernate4)

      网上有很多种解决方法例如(本人亲测有效在最后):

       1.加@JsonIgnore注解(这个不是我想实现的没有试)

        2.在web.xml加OpenSessionInViewFilter如下

<filter-name>hibernateFilter</filter-name>     
         <filter-class>  org.springframework.orm.hibernate4.support.OpenSessionInViewFilter </filter-class>   
         <init-param>
        <param-name>singleSession</param-name>
        <param-value>true</param-value>
    </init-param>
  		</filter>  
     
    <filter-mapping>     
         <filter-name>hibernateFilter</filter-name>     
         <url-pattern>/*</url-pattern>     
    </filter-mapping>  

也还是没有效。

         3.在映射文件加lazy=false(这个也不是我想实现的没有试)

         4.还有一些是ssm的方式我也没有尝试(我使用的是Springmvc+Spring+Hibernate4)

下面就是本人用的方法

此方法参考 http://blog.pastelstudios.com/2012/03/12/spring-3-1-hibernate-4-jackson-module-hibernate/

先在maven添加

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.9.1</version>
        </dependency>
       		<dependency>
			<groupId>com.fasterxml.jackson.datatype</groupId>
			<artifactId>jackson-datatype-hibernate4</artifactId>
			<version>2.7.9</version>
		</dependency>
        

然后添加第一个类

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;
 
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.Assert;
 
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
 
public class MappingJackson2HttpMessageConverter extends AbstractHttpMessageConverter<Object> {
 
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
 
    private ObjectMapper objectMapper = new ObjectMapper();
 
    private boolean prefixJson = false;
 
    public MappingJackson2HttpMessageConverter() {
       super(new MediaType("application", "json", DEFAULT_CHARSET));
    }
 
    public void setObjectMapper(ObjectMapper objectMapper) {
        Assert.notNull(objectMapper, "ObjectMapper must not be null");
        this.objectMapper = objectMapper;
    }
 
    public ObjectMapper getObjectMapper() {
        return this.objectMapper;
    }
 
    public void setPrefixJson(boolean prefixJson) {
        this.prefixJson = prefixJson;
    }
 
    @Override
    public boolean canRead(Class<?> clazz, MediaType mediaType) {
        JavaType javaType = getJavaType(clazz);
        return (this.objectMapper.canDeserialize(javaType) && canRead(mediaType));
    }
 
    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        return (this.objectMapper.canSerialize(clazz) && canWrite(mediaType));
    }
 
    @Override
    protected boolean supports(Class<?> clazz) {
        // should not be called, since we override canRead/Write instead
        throw new UnsupportedOperationException();
    }
 
    @Override
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)
    throws IOException, HttpMessageNotReadableException {
 
        JavaType javaType = getJavaType(clazz);
        try {
            return this.objectMapper.readValue(inputMessage.getBody(), javaType);
        }
        catch (JsonProcessingException ex) {
            throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex);
        }
    }
 
    @Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage)
    throws IOException, HttpMessageNotWritableException {
 
        JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
        JsonGenerator jsonGenerator =
        this.objectMapper.getJsonFactory().createJsonGenerator(outputMessage.getBody(), encoding);
        try {
            if (this.prefixJson) {
                jsonGenerator.writeRaw("{} && ");
            }
            this.objectMapper.writeValue(jsonGenerator, object);
        }
        catch (JsonProcessingException ex) {
            throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
        }
    }
 
    protected JavaType getJavaType(Class<?> clazz) {
        return TypeFactory.defaultInstance().constructType(clazz);
    }
 
    protected JsonEncoding getJsonEncoding(MediaType contentType) {
        if (contentType != null && contentType.getCharSet() != null) {
            Charset charset = contentType.getCharSet();
            for (JsonEncoding encoding : JsonEncoding.values()) {
                if (charset.name().equals(encoding.getJavaName())) {
                return encoding;
                }
            }
        }
    return JsonEncoding.UTF8;
    }
}

第二类

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;
 
public class HibernateAwareObjectMapper extends ObjectMapper {
 
    public HibernateAwareObjectMapper() {
        Hibernate4Module hm = new Hibernate4Module();
        registerModule(hm);
    }
}

配置完后在自己的springmvc.xml里面配置

<mvc:message-converters>
			<bean class="bitzh.model.utils.MappingJackson2HttpMessageConverter">
        <property name="objectMapper">
            <bean class="bitzh.model.utils.HibernateAwareObjectMapper" />
        </property>
    </bean>
	</mvc:message-converters>

若是有使用

<mvc:annotation-driven>

则如下配置

<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="bitzh.model.utils.MappingJackson2HttpMessageConverter">
        <property name="objectMapper">
            <bean class="bitzh.model.utils.HibernateAwareObjectMapper" />
        </property>
    </bean>
	</mvc:message-converters>
	</mvc:annotation-driven>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值