415不支持的媒体类型AngularJS到SpringMVC控制器

时间:2016-10-01 16:59:38

标签: java angularjs json ajax

尝试将angular Controller控制器中的JSON数据发布到SpringMVC控制器时出现此错误。我已经尝试了很多这里发布的解决方案以及网上提供的其他一些东西。我的classpath中已经有了jackson库。而且由于互联网问题,我也没有使用maven。

SpringMVC控制器

@Controller
public class MainController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @RequestMapping(value = "/employee", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody
    String saveEmployee(@RequestBody Employee employee) {

        //Will do some stuff here.
        System.out.println("INSIDE CONTROLLER");
        StringBuilder json = new StringBuilder();

        return json.toString();
    }
}

AngularJS控制器

app.controller('saveEmployeeCtrl', function ($scope, $http) {
    $scope.employee = {};

    $scope.saveEmployee = function () {
        $http({
            method: 'POST',
            url: 'employee',
            data: $scope.employee,
            headers:{'Accept':'application/json', 'Content': 'application/json'}
        }).success(function(data){
           console.log('something nice'); 
        });
    };
});

WebConfig

@EnableWebMvc
@Configuration
@ComponentScan("springmvc.com.")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/webapp/resources/static/app/**")
                .addResourceLocations("/webapp/resources/static/app/");
        registry.addResourceHandler("/webapp/resources/static/lib/**")
                .addResourceLocations("/webapp/resources/static/lib/");
        registry.addResourceHandler("/webapp/resources/static/js/**")
                .addResourceLocations("/webapp/resources/static/js/");
        registry.addResourceHandler("/webapp/resources/static/css/**")
                .addResourceLocations("/webapp/resources/static/css/");
        registry.addResourceHandler("/webapp/webapp/resources/static/views/**")
                .addResourceLocations("/webapp/webapp/resources/static/views/");
        registry.addResourceHandler("/webapp/resources/static/**")
                .addResourceLocations("/webapp/resources/static/");
    }

    @Override
    public void configureContentNegotiation(
            ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false).favorParameter(true)
                .parameterName("mediaType").ignoreAcceptHeader(true)
                .useJaf(false).defaultContentType(MediaType.APPLICATION_JSON)
                .mediaType("xml", MediaType.APPLICATION_XML)
                .mediaType("json", MediaType.APPLICATION_JSON);
    }

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

WebAppInitializer

public class WebAppInitializer implements WebApplicationInitializer {

    private static final String CONFIG_LOCATION = "springmvc.com.config";

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {

        System.out.println("***** Initializing Application for " + servletContext.getServerInfo() + " *****");

        // Create ApplicationContext
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.setConfigLocation(CONFIG_LOCATION);

        // Add the servlet mapping manually and make it initialize automatically
        DispatcherServlet dispatcherServlet = new DispatcherServlet(applicationContext);
        ServletRegistration.Dynamic servlet = servletContext.addServlet("mvc-dispatcher", dispatcherServlet);

        servlet.addMapping("/");
        servlet.setAsyncSupported(true);
        servlet.setLoadOnStartup(1);
    }
}

1 个答案:

答案 0 :(得分:0)

  1. 您正在发送标题"内容"但是你应该发送" Content-Type"
  2. 您在JSON中发送与Employee类中完全相同的字段,检查是否没有其他字段,因为Jackson设置了如果设置了无法识别的字段则失败。此问题有一些解决方案(例如您的课程上的注释或更改此设置)
  3. 最重要的是出现在服务器应用程序的日志文件中。引发此http状态的原因是什么异常。所以我上面的解决方案没有帮助你,请检查日志(可能会增加弹簧的日志级别)并在此处发布。

    <强>更新

    我还有一些其他问题:

    • 您的Employee类是否有默认(非args)构造函数,或者您只创建带参数的构造函数?你可以发布你的员工类。
    • 您的项目是否附有任何记录器,日志文件中是否有任何内容(如果有,请发布)?