Java 406尝试解析从Spring MVC控制器返回的json时出错

Java 406尝试解析从Spring MVC控制器返回的json时出错,java,json,spring-mvc,jackson,Java,Json,Spring Mvc,Jackson,我试图从我的控制器传递一个对象列表,该列表必须显示在jsp中。但是我得到了一个例外 [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver](http localhost/127.0.0.1:8080-1)处理程序执行导致异常:找不到可接受的表示形式 问题在于,即使使用products=“application/json” 内部@RequestMapping(value=“/getEmpDetail

我试图从我的控制器传递一个对象列表,该列表必须显示在jsp中。但是我得到了一个例外

[org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver](http localhost/127.0.0.1:8080-1)处理程序执行导致异常:找不到可接受的表示形式

问题在于,即使使用
products=“application/json”

内部
@RequestMapping(value=“/getEmpDetails.html”,method=RequestMethod.GET,products=“application/json”)

也许这是由于例外
处理程序执行导致异常:找不到可接受的表示形式

在浏览器中显示406错误

JBWEB000126:此请求标识的资源只能根据请求“接受”标头生成具有不可接受特征的响应

我找不到答案

我查过类似的帖子,但上面的答案并没有帮我解决问题

我用过罐子

1) jackson-mapper-asl-1.9.13.jar

2) jackson-core-asl-1.9.13.jar

3) jackson-databind-2.8.7.jar

4) jackson-core-2.8.7.jar

5) jackson-annotations-2.8.7.jar

6) jackson-datatype-joda-2.8.7.jar

7) jackson-jaxrs-json-provider-2.8.7.jar

8) jackson-module-jaxb-annotations-2.8.7.jar

我假设只需要第一个

我没有使用maven结构,因此没有pom.xml。我没有对AppConfig或WebInitializer进行任何其他更改(我使用的是java配置而不是xml)

下面是我的AppConfig

 @Configuration
 @EnableWebMvc
 @ComponentScan(basePackages = "com.myapps.empregister")
 public class AppConfig extends WebMvcConfigurerAdapter {


@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer
            .defaultContentType(MediaType.TEXT_HTML)
            .parameterName("type")
            .ignoreUnknownPathExtensions(false)
            .ignoreAcceptHeader(true)
            .favorParameter(true)
            .favorPathExtension(false)
            .useJaf(true);
}

@Bean
public ViewResolver contentNegotiatingViewResolver(ContentNegotiationManager manager) {
    ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
    resolver.setContentNegotiationManager(manager);

    // Define all possible view resolvers
    List<ViewResolver> resolvers = new ArrayList<ViewResolver>();

    resolvers.add(jsonViewResolver());
    resolvers.add(defaultViewResolver());
    resolvers.add(excelViewResolver());

    resolver.setViewResolvers(resolvers);
    return resolver;
}

@Bean
public ViewResolver defaultViewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    viewResolver.setOrder(2);

    return viewResolver;
}

@Bean(name="excelView")
public ViewResolver excelViewResolver() {
    ResourceBundleViewResolver viewResolver = new ResourceBundleViewResolver();
    viewResolver.setBasename("views");
    viewResolver.setOrder(1);

    return viewResolver;
}

@Bean
public ViewResolver jsonViewResolver() {
    return new JsonViewResolver();
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}

@Bean(name = "multipartResolver")
public StandardServletMultipartResolver resolver() {
    return new StandardServletMultipartResolver();
}
}
以下是我的控制器代码

@RequestMapping(method = RequestMethod.GET, value = "/getEmpDetails.html", produces="application/json;charset=utf-8")
public @ResponseBody List<EmpRecordParams> getEmpDetails(@RequestParam String id, HttpServletRequest request, HttpServletResponse response,
        Model model) {
    System.out.println("get");
    List<EmpRecordParams> empRecordParams = empRegisterService.getEmpDetails(id);
    return empRecordParams;
}
请帮助我解决此异常


提前感谢

我终于找到了答案

变化不大,但花了很多时间才注意到同样的变化

我对其进行了以下更改

WebAppInitializer.java (这相当于web.xml)

这是如此简单,我后悔自己没有找到这个之前

然后我在中的
configureContentNegotiation
中更改了
.ignoreAcceptHeader(false)

AppConfig.java

最后,我对
ajax调用
和Controller
@RequestMapping
进行了更改,以调用getEmpDetails.json

就这样解决了

最重要的部分是servlet映射,没有它就不可能实现


特别感谢@RC和@p.J.Meisch帮助我解决了这个问题。感谢所有花时间研究这个问题的人。

阅读,我认为您需要在
configureContentNegotiation
@RC中设置json。我已经按照您的建议进行了更改,但仍然会出现相同的异常。这很有可能是因为url以
结尾。html
尝试使用
@RequestMapping(value=“/getEmpDetails.json
您可以调用
${pageContext.request.contextPath}/new/getEmpDetails.html
通过浏览器或使用curl解析的URL吗?它是否解析为正确的URL?”继续接收未找到的请求错误“你有没有修改过json代码来获取json url?如果你可以共享一个完整的项目来重现你的问题,可能有人会花时间来帮助你(否则这是一个死胡同)
public class JsonViewResolver implements ViewResolver{

    @Override
    public View resolveViewName(String viewName, Locale locale) throws Exception {
        MappingJackson2JsonView view = new MappingJackson2JsonView();
        view.setPrettyPrint(true);    
        return view;
      }

}
@RequestMapping(method = RequestMethod.GET, value = "/getEmpDetails.html", produces="application/json;charset=utf-8")
public @ResponseBody List<EmpRecordParams> getEmpDetails(@RequestParam String id, HttpServletRequest request, HttpServletResponse response,
        Model model) {
    System.out.println("get");
    List<EmpRecordParams> empRecordParams = empRegisterService.getEmpDetails(id);
    return empRecordParams;
}
var empDetails = function() {
    $
            .ajax({
                type : "GET",
                url : "${pageContext.request.contextPath}/new/getEmpDetails.html",
                headers: {Accept: '*/*'},
                data : {
                    "id" : $("#empNo").val()
                },
                success : function(data) {
                        //Other functions
                        -------------
                    }

                 }
@Override
protected String[] getServletMappings() {
return new String[] { "*.html", "*.json" };
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer
            .defaultContentType(MediaType.TEXT_HTML)
            .parameterName("type")
            .ignoreUnknownPathExtensions(false)
            .ignoreAcceptHeader(false)
            .favorParameter(true)
            .favorPathExtension(false)
            .useJaf(true);
}