package net.eusashead.bjugquerydsl.config;
import java.util.List;
import net.eusashead.bjugquerydsl.controller.FieldInitializer;
import net.eusashead.bjugquerydsl.controller.HibernateFieldInitializer;
import net.eusashead.bjugquerydsl.controller.SkuSearchRequestHandlerMethodArgumentResolver;
import net.eusashead.bjugquerydsl.hateoas.HalPageResponseEntityBuilderHandlerMethodArgumentResolver;
import net.eusashead.bjugquerydsl.hateoas.HalResponseEntityBuilderHandlerMethodArgumentResolver;
import net.eusashead.bjugquerydsl.hateoas.JpaEntityResourceMetadataExtractor;
import net.eusashead.bjugquerydsl.hateoas.RepresentationConverter;
import net.eusashead.bjugquerydsl.hateoas.RepresentationConverterImpl;
import net.eusashead.bjugquerydsl.hateoas.SimplePropertyConverterImpl;
import net.eusashead.hateoas.converter.hal.HalHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Import;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;
import com.theoryinpractise.halbuilder.DefaultRepresentationFactory;
import com.theoryinpractise.halbuilder.api.RepresentationFactory;
@Configuration
@Import(JpaConfig.class)
@EnableAspectJAutoProxy(proxyTargetClass=true)
@ComponentScan(basePackageClasses=net.eusashead.bjugquerydsl.controller.Marker.class)
public class WebConfig extends WebMvcConfigurationSupport {
/* (non-Javadoc)
* @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#configureMessageConverters(java.util.List)
*/
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
converters.add(halConverter());
converters.add(jsonConverter());
}
/* (non-Javadoc)
* @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addArgumentResolvers(java.util.List)
*/
@Override
protected void addArgumentResolvers(
List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(pageableResolver());
argumentResolvers.add(skuSearchResolver());
argumentResolvers.add(halResponseEntityBuilderResolver());
argumentResolvers.add(halPageResponseEntityBuilderResolver());
super.addArgumentResolvers(argumentResolvers);
}
/**
* Set up a {@link PageableHandlerMethodArgumentResolver}
* to automatically extract paging parameters from a
* request
* @return
*/
@Bean
public PageableHandlerMethodArgumentResolver pageableResolver() {
PageableHandlerMethodArgumentResolver pageArgResolver = new PageableHandlerMethodArgumentResolver();
Pageable fallback = new PageRequest(0, 20);
pageArgResolver.setFallbackPageable(fallback);
return pageArgResolver;
}
/**
* Set up a {@link PageableHandlerMethodArgumentResolver}
* to automatically extract paging parameters from a
* request
* @return
*/
@Bean
public SkuSearchRequestHandlerMethodArgumentResolver skuSearchResolver() {
SkuSearchRequestHandlerMethodArgumentResolver argResolver = new SkuSearchRequestHandlerMethodArgumentResolver();
return argResolver;
}
/**
* Set up the Jackson JSON
* {@link HttpMessageConverter}
* @return
*/
@Bean
public HttpMessageConverter<Object> jsonConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(jsonMapper());
return converter;
}
/**
* JAXB converter
* @return
*/
@Bean
public HttpMessageConverter<Object> jaxbConverter() {
Jaxb2RootElementHttpMessageConverter converter = new Jaxb2RootElementHttpMessageConverter();
return converter;
}
/**
* Configure a Jackson {@link ObjectMapper}
* with the {@link Hibernate4Module} so
* that JPA objects are correctly
* serialized (e.g. lazy associations
* aren't automatically serialized)
* @return configured {@link ObjectMapper}
*/
@Bean(name="jsonMapper")
public ObjectMapper jsonMapper() {
ObjectMapper mapper = new ObjectMapper();
Hibernate4Module hm = new Hibernate4Module();
hm.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, false);
mapper.registerModule(hm);
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
mapper.setSerializationInclusion(Include.NON_NULL); // This doesn't work with Hibernate4Module :-(
return mapper;
}
@Bean
public FieldInitializer fieldInitializer() {
return new HibernateFieldInitializer();
}
@Bean
public RepresentationFactory representationFactory() {
return new DefaultRepresentationFactory();
}
@Bean
public HalResponseEntityBuilderHandlerMethodArgumentResolver halResponseEntityBuilderResolver() {
return new HalResponseEntityBuilderHandlerMethodArgumentResolver(representationFactory(), representationConverter(), "fields");
}
@Bean
public HalPageResponseEntityBuilderHandlerMethodArgumentResolver halPageResponseEntityBuilderResolver() {
return new HalPageResponseEntityBuilderHandlerMethodArgumentResolver(representationFactory(), representationConverter(), "fields");
}
@Bean
public RepresentationConverter representationConverter() {
RepresentationConverterImpl representationConverter = new RepresentationConverterImpl(representationFactory(), new SimplePropertyConverterImpl());
representationConverter.registerExtractor(new JpaEntityResourceMetadataExtractor());
return representationConverter;
}
@Bean
public HalHttpMessageConverter halConverter() {
return new HalHttpMessageConverter(representationFactory());
}
}