Search code examples
javaxmlspringannotationsspring-java-config

Spring tutorial example - Apache excel POI export using java config


I am looking at this mkyong tutorial for exporting to excel.

It looks pretty straight forward and not overly complicated. I was able to complete all of the steps except for the last one. The last step is a XML config step. I have my project setup using java annotation config and the example in the tutorial is in xml. How do I configure the following XmlViewResolver in 'java config' / annotaiton as opposed to xml? see code snippet below.


This is the part I dont know how to configure. I am trying to get it in annotation/java config format.

Spring Configuration

<beans ...>

  <bean
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

    <bean class="com.mkyong.common.controller.RevenueReportController" />

    <bean class="org.springframework.web.servlet.view.XmlViewResolver">
        <property name="location">
            <value>/WEB-INF/spring-excel-views.xml</value>
        </property>
    </bean>

</beans>

File : spring-excel-views.xml

<bean id="ExcelRevenueSummary"
    class="com.mkyong.common.view.ExcelRevenueReportView">
</bean>

This is what my controller looks like.

@Controller
public class RevenueReportController extends AbstractController{

    private Logger log = LoggerFactory.getLogger(getClass());

    @Override
    @RequestMapping(value = "/search/exportToExcel", method = RequestMethod.GET)
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {

        String output = ServletRequestUtils.getStringParameter(request, "output");

        //dummy data
        Map<String,String> revenueData = new HashMap<String,String>();
        revenueData.put("Jan-2010", "$100,000,000");
        revenueData.put("Feb-2010", "$110,000,000");
        revenueData.put("Mar-2010", "$130,000,000");
        revenueData.put("Apr-2010", "$140,000,000");
        revenueData.put("May-2010", "$200,000,000");

        if(output ==null || "".equals(output)){
            //return normal view
            return new ModelAndView("RevenueSummary","revenueData",revenueData);

        }else if("EXCEL".equals(output.toUpperCase())){
            //return excel view
            return new ModelAndView("ExcelRevenueSummary","revenueData",revenueData);

        }else{
            //return normal view
            return new ModelAndView("RevenueSummary","revenueData",revenueData);

        }
    }
}

Solution

  • Extending my comment to original post, here is a version that does not need any xml config. With this solution you can completely eliminate the xml views. You can define you excel view as another bean and use that directly in your controller.

    Config class:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    
    @EnableWebMvc
    @ComponentScan(basePackages = { "com.mkyong.common" })
    @Configuration
    public class AppConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    
        @Bean
        public ExcelRevenueReportView excelRevenueReportView() {
            return new ExcelRevenueReportView();
        }
    
        @Bean
        public InternalResourceViewResolver getInternalResourceViewResolver() {
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setPrefix("/WEB-INF/");
            resolver.setSuffix(".jsp");
            return resolver;
        }
    
    }
    

    Contorller:

    @Controller
    public class RevenueReportController extends AbstractController{
    
        private Logger log = LoggerFactory.getLogger(getClass());
    
        @Autowired
        ExcelRevenueReportView excelRevenueReportView;
    
        @Override
        @RequestMapping(value = "/search/exportToExcel", method = RequestMethod.GET)
        protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
            String output = ServletRequestUtils.getStringParameter(request, "output");
    
            //dummy data
            Map<String,String> revenueData = new HashMap<String,String>();
            revenueData.put("Jan-2010", "$100,000,000");
            revenueData.put("Feb-2010", "$110,000,000");
            revenueData.put("Mar-2010", "$130,000,000");
            revenueData.put("Apr-2010", "$140,000,000");
            revenueData.put("May-2010", "$200,000,000");
    
            if(output ==null || "".equals(output)){
                //return normal view
                return new ModelAndView("RevenueSummary","revenueData",revenueData);
    
            }else if("EXCEL".equals(output.toUpperCase())){
                //return excel view
                new ModelAndView(excelRevenueReportView, "revenueData", revenueData);
    
            }else{
                //return normal view
                return new ModelAndView("RevenueSummary","revenueData",revenueData);
    
            }
        }
    }