配置Jackson以在Spring Boot中省略延迟加载属性

时间:2015-11-16 00:54:57

标签: hibernate spring-boot jackson lazyload

在spring boot mvc项目中使用纯java配置如何配置Jackson以省略延迟加载属性

6 个答案:

答案 0 :(得分:14)

使用最新版本的Spring Boot,这更容易。

  

任何类型为com.fasterxml.jackson.databind.Module的bean都将自动注册到自动配置的Jackson2ObjectMapperBuilder,并应用于它创建的任何ObjectMapper实例。这为您在应用程序中添加新功能时提供了一种提供自定义模块的全局机制。

74.3 Customize the Jackson ObjectMapper

首先确保你拥有杰克逊所需的依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate4</artifactId>
</dependency>

然后,您只需将模块作为@Bean包含在应用程序上下文中。

@Bean
public Module hibernate4Module()
{
    return new Hibernate4Module();
}

答案 1 :(得分:6)

如果您使用的是SpringBoot,理想情况下您应该已经拥有 Hibernate4Module 。 否则添加此依赖项

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hibernate4</artifactId>
        <version>2.5.3</version>
    </dependency>

接下来创建一个名为“HibernateAwareObjectMapper”的类或任何你想要命名的类:

以下内容:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;

    public class HibernateAwareObjectMapper extends ObjectMapper {

        public HibernateAwareObjectMapper() {
            registerModule(new Hibernate4Module());
        }
    }

对于不同版本的Hibernate,请参考这些Hibernate模块:

// for Hibernate 4.x:
mapper.registerModule(new Hibernate4Module());
// or, for Hibernate 5.x
mapper.registerModule(new Hibernate5Module());
// or, for Hibernate 3.6
mapper.registerModule(new Hibernate3Module());

现在您需要通过消息Converter注册 HibernateAwareObjectMapper 。为此,创建一个扩展的Config类,扩展WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter。 (如果你已经有一个只是按照下一步)。

现在使用HibernateObjectMapper注册MessageConverter:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
    List<MediaType> supportedMediaTypes=new ArrayList<>();
    supportedMediaTypes.add(MediaType.APPLICATION_JSON);
    supportedMediaTypes.add(MediaType.TEXT_PLAIN);
    MappingJackson2HttpMessageConverter converter=new MappingJackson2HttpMessageConverter();
    converter.setObjectMapper(new HibernateAwareObjectMapper());
    converter.setPrettyPrint(true);
    converter.setSupportedMediaTypes(supportedMediaTypes);
    converters.add(converter);
    super.configureMessageConverters(converters);
}

Viola !!!那应该够了。 这是用于Spring启动Web应用程序的纯java(无xml)方式。

如果您想添加到答案,请随意发表评论。

答案 2 :(得分:4)

我使用springboot和hibernamte5.0.x。 可行!

1。 pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.8.4</version>
</dependency>

2。 Webconfig

@Configuration
public class WebConfig implements WebMvcConfigurer {

    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate5Module());
                // replace Hibernate4Module() with the proper class for your hibernate version.
            }
        }
    }
}

答案 3 :(得分:2)

For me the easiest way to achieve this was to extend WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter and override extendMessageConverters method. Inside I've searched for the MappingJackson2HttpMessageConverter and just registered Jackson Hibernate module.

@Configuration
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class CustomWebMvcAutoConfig extends WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter
{
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate4Module());
                // replace Hibernate4Module() with the proper class for your hibernate version.
            }
        }
    }
}

This way you won't lose all the default converters configured by Spring.

答案 4 :(得分:0)

#property indicator_separate_window
#property indicator_buffers         3
#property indicator_color1          Red
#property indicator_color2          Blue
#property indicator_color3          Green

      double    FillBuffer[];
      double       DBuffer[];                         // NEVER FILLED IN
      double AverageBuffer[];                         // NEVER FILLED IN

      double point = Point();

int   init()
{     int    period =  _Period;                       // NEVER CONSUMED    
      string symbol =   Symbol();                     // NEVER CONSUMED
      int    digits =  _Digits ;                      // LOCAL SCOPE ONLY VISIBLE INSIDE init(){...}
             point  =  _Point ;

      if (  digits == 5 || digits == 3 ) { digits -=  1;
                                           point  *= 10;
                                           }

      SetIndexBuffer( 0,       DBuffer );
      SetIndexBuffer( 1,    FillBuffer );             // 1: ASSIGNED, BUT NEVER SET TO HAVE ANY { DRAW_LINE | DRAW_ ... } GUI OUTPUT
      SetIndexBuffer( 2, AverageBuffer );             // 2: ASSIGNED, BUT NEVER SET TO HAVE ANY { DRAW_LINE | DRAW_ ... } GUI OUTPUT
      SetIndexStyle ( 0, DRAW_LINE, STYLE_SOLID, 1 ); // 0: SET AS DRAW_LINE ( BUT NEVER FILLED IN WITH DATA )
      SetIndexLabel(  0, "ADR" );

      return( INIT_SUCCEEDED );
   }

int   start()
{     int i, limit, counted_bars;
      counted_bars = IndicatorCounted();
//----check for possible errors
      if ( counted_bars < 0 ) return( -1 );

//----last counted bar will be recounted
      if ( counted_bars > 0 ) counted_bars--;

      limit = ( Bars - 5 ) - counted_bars;            // AVOID 1st 5 BARS,
      int   i0, i1, i2, i3, i4, i5;                   // WHERE (i+5) WILL OVERFLOW THE TIMESERIES LEFT EDGE
      for ( i  = limit,
            i1 = i + 1,
            i2 = i + 2,
            i3 = i + 3,
            i4 = i + 4,
            i5 = i + 5; i >= 0; i--,
                                i1--,
                                i2--,
                                i3--,
                                i4--,
                                i5--
                                )
      {     FillBuffer[i]  = (   High[i]
                                - Low[i]
                                )
                           / ( ( High[i1] + High[i2] + High[i3] + High[i4] + High[i5] )
                             - (  Low[i1] +  Low[i2] +  Low[i3] +  Low[i4] +  Low[i5] )
                               )
                           / 5.
                           / point;

         /* double dbuff   = iHigh( NULL, 0, i   ) - iLow( NULL, 0, i   );
            double D0      = iHigh( NULL, 0, i+1 ) - iLow( NULL, 0, i+1 );
            double D1      = iHigh( NULL, 0, i+2 ) - iLow( NULL, 0, i+2 );
            double D2      = iHigh( NULL, 0, i+3 ) - iLow( NULL, 0, i+3 );
            double D3      = iHigh( NULL, 0, i+4 ) - iLow( NULL, 0, i+4 );
            double D4      = iHigh( NULL, 0, i+5 ) - iLow( NULL, 0, i+5 );
            double Average = ( ( D0 + D1 + D2 + D3 + D4 ) / 5 ) / point;
            FillBuffer[i]  = dbuff / Average;
            */
      }
      return( 0 );
 }

答案 5 :(得分:-1)

@Grzegorz所写的内容对我来说是完美的。只是为了在这里提出他没有自定义类的解决方案:

编辑:我在RestController域

@Configuration
public class CustomWebMvcAutoConfig extends WebMvcConfigurerAdapter
{
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate5Module());
                // replace Hibernate4Module() with the proper class for your hibernate version.
            }
        }
    }
}