title: Spring MVC + JQuery + DataTables + AJAX
body: <p>so I am trying to fill jQuery plugin dataTables with data from my database - the problem now is how do I add a mapping for a custom servlet in java (config) only?</p>
  
  <p>What this guy has to say is close <a href="https://stackoverflow.com/questions/21244066/spring-javaconfig-add-mapping-for-custom-servlet">Spring JavaConfig: Add mapping for custom Servlet</a> , but I dont have a "onStartup" method anywhere in my classes - all javaconfig by the way no XML</p>
  
  <p>When i dont try an ajax call and load my data from the controller to the jsp page the datatable plugin works fine and renders the table correctly so I know the problem has to be AJAX related.</p>
  
  <p>I have a servlet UserDataSerlvet</p>
  
  <pre><code>package com.crutchclothing.json.datatable;
  
  import java.io.IOException;
  import java.io.PrintWriter;
  import java.util.List;
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import org.codehaus.jackson.map.ObjectMapper;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.beans.factory.annotation.Qualifier;
  import com.crutchclothing.users.model.User;
  import com.crutchclothing.users.service.UserService;
  import com.google.gson.Gson;
  import com.google.gson.GsonBuilder;
  
  public class UserDataServlet extends HttpServlet { 
  
   @Autowired
   @Qualifier("userService")
   UserService userService;
   private static final long serialVersionUID = 1L; 
  
   public UserDataServlet() { 
    super(); 
   } 
  
   protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
  
    response.setContentType("application/json"); 
    PrintWriter out = response.getWriter(); 
    List&lt;User&gt; lisOfUsers = userService.findAllUsers(); 
    DataTableObject dataTableObject = new DataTableObject(); 
    dataTableObject.setAaData(lisOfUsers); 
    Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
    String json = gson.toJson(dataTableObject); 
    out.print(json);  
   } 
  
   protected void doPost(HttpServletRequest request, 
  
     HttpServletResponse response) throws ServletException, IOException { 
    doGet(request, response); 
   } 
  
  }
  </code></pre>
  
  <p>And now in my JSP this is my javascript code to call datatables</p>
  
  <pre><code> &lt;script type="text/javascript"&gt;
      $(document).ready(function() {
      $('#users').dataTable({
          'bPaginate': true,
          'sAjaxSource': './UserDataServlet',
          'iDisplayLength': 5,
          'bSort' : false,
          'aoColumns' : [{'mData' : 'username'},
                         { 'mData': 'firstName' },
                         { 'mData': 'middleInit' },
                         { 'mData': 'lastName' },
                         { 'mData': 'phoneNumber' },
                         { 'mData': 'address1' },
                         { 'mData': 'city' },
                         { 'mData': 'state' },
                         { 'mData': 'email' }]
  
           });
  
      });
  
      &lt;/script&gt;
  </code></pre>
  
  <p>Does the amount of mData tags have to match up with the objects property? For example my user class has more properties than listed but those are the useful ones.</p>
  
  <p>And finally my config classes - this is where I think the mapping needs to be added but unsure how to do it</p>
  
  <pre><code>package com.crutchclothing.config;
  
  import java.util.Properties;
  
  import org.apache.commons.dbcp.BasicDataSource;
  import org.hibernate.SessionFactory;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.ComponentScan;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.context.annotation.Import;
  import org.springframework.orm.hibernate4.HibernateTransactionManager;
  import org.springframework.orm.hibernate4.LocalSessionFactoryBuilder;
  import org.springframework.transaction.annotation.EnableTransactionManagement;
  import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  import org.springframework.web.servlet.view.InternalResourceViewResolver;
  import org.springframework.web.servlet.view.JstlView;
  
  import com.crutchclothing.web.controller.RegistrationValidator;
  
  @EnableWebMvc
  @Configuration
  @ComponentScan({ "com.crutchclothing.*" })
  @EnableTransactionManagement
  @Import({ SecurityConfig.class })
  public class AppConfig {
  
  @Bean
  public SessionFactory sessionFactory() {
      LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource());
      builder
          .scanPackages("com.crutchclothing.users.model",
                  "com.crutchclothing.products.model",
                  "com.crutchclothing.cart.model",
                  "com.crutchclothing.orders.model")
          .addProperties(getHibernateProperties());
  
      return builder.buildSessionFactory();
  }
  
  private Properties getHibernateProperties() {
      Properties prop = new Properties();
      prop.put("hibernate.format_sql", "true");
      prop.put("hibernate.show_sql", "true");
      prop.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
      return prop;
  }
  
  @Bean(name = "dataSource")
  public BasicDataSource dataSource() {
  
      BasicDataSource ds = new BasicDataSource();
      ds.setDriverClassName("com.mysql.jdbc.Driver");
      ds.setUrl("jdbc:mysql://localhost:3306/crutch_db");
      ds.setUsername("bobby");
      ds.setPassword("password");
      return ds;
  }
  
  @Bean
  public HibernateTransactionManager txManager() {
      return new HibernateTransactionManager(sessionFactory());
  }
  
  @Bean
  public InternalResourceViewResolver viewResolver() {
      InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
      viewResolver.setViewClass(JstlView.class);
      viewResolver.setPrefix("/WEB-INF/pages/");
      viewResolver.setSuffix(".jsp");
      return viewResolver;
  }
  
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
      registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
  }
  
  @Bean
  public RegistrationValidator registrationValidator() {
      return new RegistrationValidator();
  }
  
  }
  
  package com.crutchclothing.config;
  
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.beans.factory.annotation.Qualifier;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import     org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  import     org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  import org.springframework.security.core.userdetails.UserDetailsService;
  import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  import org.springframework.security.crypto.password.PasswordEncoder;
  
  @Configuration
  @EnableWebSecurity
  public class SecurityConfig extends WebSecurityConfigurerAdapter {
  
  @Autowired
  @Qualifier("userDetailsService")
  UserDetailsService userDetailsService;
  
  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
  }
  
  @Override
  protected void configure(HttpSecurity http) throws Exception {
  
      http.authorizeRequests().antMatchers("/admin/**")
          .access("hasRole('ROLE_ADMIN')").and().formLogin()
          .loginPage("/login").failureUrl("/login?error")
              .usernameParameter("username")
              .passwordParameter("password")
              .and().logout().logoutSuccessUrl("/login?logout")
              .and().csrf()
              .and().exceptionHandling().accessDeniedPage("/403");
  }
  
  @Bean
  public PasswordEncoder passwordEncoder(){
      PasswordEncoder encoder = new BCryptPasswordEncoder();
      return encoder;
  }
  
  }
  </code></pre>
  
  <p>The relavent info in the console</p>
  
  <pre><code>23:56:45.260 DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'dispatcher' processing GET request for [/crutchclothing/UserDataServlet]
  23:56:45.260 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /UserDataServlet
  23:56:45.261 DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Did not find handler method for [/UserDataServlet]
  23:56:45.261 WARN  o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/crutchclothing/UserDataServlet] in DispatcherServlet with name 'dispatcher'
  </code></pre>
  
  <p>When I run on server from within eclipse I get an error </p>
  
  <p>"DataTables warning: table id=users - ajax error. For more information about this error, please see <a href="http://datatables.net/tn/7" rel="nofollow noreferrer">http://datatables.net/tn/7</a>"</p>
  
  <p>But nothing when run in IE 9 and Chrome (Latest)
  Thank you</p>