Java 如何在SpringMVC中将.json映射到.html url
我正在开发Spring4.2MVC应用程序。这里我试图调用一个.html扩展url,该url应该返回json数据。问题是,当控制器调用特定url时,我得到一个org.springframework.web.HttpMediaTypeNotAcceptableException。如果我使用.json扩展名而不是.html扩展名,这将非常有效 我使用以下JAR进行json映射Java 如何在SpringMVC中将.json映射到.html url,java,json,spring,jackson,Java,Json,Spring,Jackson,我正在开发Spring4.2MVC应用程序。这里我试图调用一个.html扩展url,该url应该返回json数据。问题是,当控制器调用特定url时,我得到一个org.springframework.web.HttpMediaTypeNotAcceptableException。如果我使用.json扩展名而不是.html扩展名,这将非常有效 我使用以下JAR进行json映射 jackson-annotations-2.8.7.jar jackson-core-2.8.7.jar jackson-c
jackson-annotations-2.8.7.jar
jackson-core-2.8.7.jar
jackson-core-asl-1.9.13.jar
jackson-databind-2.8.7.jar
jackson-datatype-joda-2.8.7.jar
jackson-jaxrs-json-provider-2.8.7.jar
jackson-mapper-asl-1.9.13.jar
jackson-module-jaxb-annotations-2.8.7.jar
json-simple-1.1.jar
以下是我基于java的配置,而不是web.xml
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { AppConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "*.html", "*.json"};
}
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
registration.setMultipartConfig(getMultipartConfigElement());
}
private MultipartConfigElement getMultipartConfigElement() {
MultipartConfigElement multipartConfigElement = new MultipartConfigElement( LOCATION, MAX_FILE_SIZE, MAX_REQUEST_SIZE, FILE_SIZE_THRESHOLD);
return multipartConfigElement;
}
private static final long MAX_FILE_SIZE = 5242880; // 5MB : Max file size.
// Beyond that size spring will throw exception.
private static final long MAX_REQUEST_SIZE = 20971520; // 20MB : Total request size containing Multi part.
private static final int FILE_SIZE_THRESHOLD = 0; // Size threshold after which files will be written to disk
}
我有一个调用url的ajax调用
var getDetails = function() {
var id = {
"id" : $("#id").val()
}
$
.ajax({
type : "POST",
url : "../data/getDetails.html",
data : JSON.stringify(id),
contentType : "application/json; charset=utf-8",
mimeType: "application/json",
dataType : 'json',
success : function(data) {
// do something
}
以下是服务器日志
信息标准:71-2017-10-16 12:13:53调试DispatcherServlet:861-名为“dispatcher”的DispatcherServlet正在处理[/App/data/getDetails.html]的POST请求。
DEBUG DispatcherServlet:861-名为“dispatcher”的DispatcherServlet正在处理[/App/data/getDetails.html]的POST请求
INFO stdout:71-2017-10-16 12:13:53调试请求映射HandlerMapping:320-查找处理程序方法中的path/data/getDetails.html
DEBUG RequestMappingHandlerMapping:320-查找path/data/getDetails.html的处理程序方法
INFO stdout:71-2017-10-16 12:13:53调试异常HandlerExceptionResolver:131-从处理程序解析异常[null]:org.springframework.web.HttpMediaTypeNotAcceptableException:找不到可接受的表示形式
DEBUG exception handler exception resolver:131-从处理程序解析异常[null]:org.springframework.web.httpmediatype notacceptableexception:找不到可接受的表示形式
INFO stdout:71-2017-10-16 12:13:53调试DefaultListableBeanFactory:250-返回单例bean“globalExceptionController”的缓存实例
DEBUG DefaultListableBeanFactory:250-返回单例bean“globalExceptionController”的缓存实例
请帮忙 (我无权对你的帖子发表评论..所以请对我的帖子发表评论..)
您是否在注释中尝试过像products=“application/json”
这样的consumes=“application/json”
及
在ajax调用中,您同时使用了contentType和dataType。您希望得到json格式的响应,对吗?(我无权对您的帖子发表评论..所以请对我的帖子发表评论..)
您是否在注释中尝试过像products=“application/json”
这样的consumes=“application/json”
及
在ajax调用中,您同时使用了contentType和dataType。您希望得到json格式的响应,对吗?假设您使用的是默认值 spring mvc配置。默认情况下,它使用InternalResourceViewResolver。您需要做的是配置ContentNegotiatingViewResolver,它尝试根据内容类型解析视图。我不张贴一个例子,因为你们会发现很多在互联网上
我建议您阅读有关REST端点的内容,并在编写端点时使用适当的符号和标准。例如,在您的问题中,您有一个返回json响应的.html端点是非常正确的。假设您使用的是默认值 spring mvc配置。默认情况下,它使用InternalResourceViewResolver。您需要做的是配置ContentNegotiatingViewResolver,它尝试根据内容类型解析视图。我不张贴一个例子,因为你们会发现很多在互联网上
我建议您阅读有关REST端点的内容,并在编写端点时使用适当的符号和标准。例如,在您的问题中,您有一个返回json响应的.html端点是非常正确的。Remove
从@RequestMapping
注释生成标记。然后它就会工作。删除从@RequestMapping
注释中生成标记。然后它就会起作用。试着使用products=“text/plain”
@SachinGupta没有试过working@SachinGupta我已经用服务器logRemoveproducts
tag更新了这个问题,然后运行了谢谢@Sachin,你救了我一天。请将其作为answr发布,以便我可以接受。请尝试使用products=“text/plain”
@SachinGupta尝试不使用working@SachinGupta我已经用服务器logRemoveproducts
tag更新了这个问题,然后运行了谢谢@Sachin,你救了我一天。请将其作为answr发布,以便我可以接受。根据您的异常情况。您是否尝试了PRODUCTS={MediaType.APPLICATION_JSON_VALUE}?暂时您可以在ajax调用中注释mimeType。应该可以解决此问题。若要从控制器返回JSON格式的java对象,可以使用Gson api.use toJson()/fromJson()在使用.json时,转换jsonString/JavaJSON格式已经开始工作。。。这里的问题是控制器甚至无法正确映射调用。这里的问题似乎是.html格式对于JSONA来说是不可接受的。您是否尝试过生成={MediaType.APPLICATION_JSON_VALUE}?暂时您可以在ajax调用中注释mimeType。它应该可以解决此问题。要从控制器返回json格式的java对象,您可以使用Gson api。使用toJson()/fromJson()转换jsonString/javareturning json格式在使用.json时已经起作用了。。。这里的问题是控制器甚至无法正确映射调用。这里的问题似乎是.html格式对于json是不可接受的
var getDetails = function() {
var id = {
"id" : $("#id").val()
}
$
.ajax({
type : "POST",
url : "../data/getDetails.html",
data : JSON.stringify(id),
contentType : "application/json; charset=utf-8",
mimeType: "application/json",
dataType : 'json',
success : function(data) {
// do something
}