package org.magnum.mobilecloud.video;
import org.magnum.mobilecloud.video.json.ResourcesMapper;
import org.magnum.mobilecloud.video.repository.VideoRepository;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import com.fasterxml.jackson.databind.ObjectMapper;
//Tell Spring to automatically inject any dependencies that are marked in
//our classes with @Autowired
@EnableAutoConfiguration
// Tell Spring to automatically create a JPA implementation of our
// VideoRepository
@EnableJpaRepositories(basePackageClasses = VideoRepository.class)
// Tell Spring to turn on WebMVC (e.g., it should enable the DispatcherServlet
// so that requests can be routed to our Controllers)
@EnableWebMvc
// Tell Spring that this object represents a Configuration for the
// application
@Configuration
// Tell Spring to go and scan our controller package (and all sub packages) to
// find any Controllers or other components that are part of our applciation.
// Any class in this package that is annotated with @Controller is going to be
// automatically discovered and connected to the DispatcherServlet.
@ComponentScan
public class Application extends RepositoryRestMvcConfiguration {
// Tell Spring to launch our app!
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
// We are overriding the bean that RepositoryRestMvcConfiguration
// is using to convert our objects into JSON so that we can control
// the format. The Spring dependency injection will inject our instance
// of ObjectMapper in all of the spring data rest classes that rely
// on the ObjectMapper. This is an example of how Spring dependency
// injection allows us to easily configure dependencies in code that
// we don't have easy control over otherwise.
//
// Normally, we would not override this object mapping. However, in this
// case, we are overriding the JSON conversion so that we can easily
// extract a list of videos, etc. using Retrofit. You can remove this
// method from the class to see what the default HATEOAS-based responses
// from Spring Data Rest look like. You will need to access the server
// from your browser as removing this method will break the Retrofit
// client.
//
// See the ResourcesMapper class for more details.
@Override
public ObjectMapper halObjectMapper(){
return new ResourcesMapper();
}
}