Java 406尝试解析从Spring MVC控制器返回的json时出错
我试图从我的控制器传递一个对象列表,该列表必须显示在jsp中。但是我得到了一个例外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
[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);
}