Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC4:“;应用程序/json“;未正确设置内容类型_Java_Json_Spring_Spring Mvc_Content Type - Fatal编程技术网

Java SpringMVC4:“;应用程序/json“;未正确设置内容类型

Java SpringMVC4:“;应用程序/json“;未正确设置内容类型,java,json,spring,spring-mvc,content-type,Java,Json,Spring,Spring Mvc,Content Type,我有一个映射了以下注释的控制器: @RequestMapping(value = "/json", method = RequestMethod.GET, produces = "application/json") @ResponseBody public String bar() { return "{\"test\": \"jsonResponseExample\"}"; } 我返回一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容

我有一个映射了以下注释的控制器:

@RequestMapping(value = "/json", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public String bar() {
    return "{\"test\": \"jsonResponseExample\"}";
}
我返回一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容类型不是
application/JSON
,而是纯
text/html
。为什么没有设置内容类型

我的
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <display-name>Spring MVC Web Application</display-name>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- static assets -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

使用WildFly 8.1作为我的应用服务器。

使用jackson库和控制器返回类型的
@ResponseBody
注释


如果您希望返回表示为JSon的POJO,则可以使用此方法。如果您想返回字符串而不是作为JSon返回POJO,请参考Sotirious答案。

首先要了解的是

@RequestMapping(value = "/json", method = RequestMethod.GET, produces = "application/json")
仅用于限制请求处理程序的映射它不做其他事情。

然后,假设您的方法的返回类型为
String
,并使用
@ResponseBody
进行注释,则返回值将由该函数处理,该函数将
内容类型
标题设置为
文本/普通
。如果您想自己返回JSON字符串并将标题设置为
application/JSON
,请使用
ResponseEntity
(去掉
@responseBy
)的返回类型并向其添加适当的标题

@RequestMapping(value = "/json", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity<String> bar() {
    final HttpHeaders httpHeaders= new HttpHeaders();
    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    return new ResponseEntity<String>("{\"test\": \"jsonResponseExample\"}", httpHeaders, HttpStatus.OK);
}
@RequestMapping(value=“/json”,method=RequestMethod.GET,products=“application/json”)
公众响应栏(){
最终HttpHeaders HttpHeaders=新HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
返回新的ResponseEntity(“{\“test\”:\“jsonResponseExample\”),httpHeaders,HttpStatus.OK);
}

请注意,您可能应该

<mvc:annotation-driven /> 


在servlet上下文配置中,使用最合适的默认值设置MVC配置。

正如其他人所评论的,因为方法的返回类型是
String
Spring不需要对结果做任何事情

如果更改签名以使返回类型需要编组,这将有助于:

@RequestMapping(value = "/json", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public Map<String, Object> bar() {
    HashMap<String, Object> map = new HashMap<String, Object>();
    map.put("test", "jsonRestExample");
    return map;
}
@RequestMapping(value=“/json”,method=RequestMethod.GET,products=“application/json”)
@应答器
公共地图栏(){
HashMap=newHashMap();
put(“test”、“jsonrest示例”);
返回图;
}

当我升级到Spring 4时,我需要更新jackson依赖项,如下所示:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.5.1</version>
    </dependency>        

com.fasterxml.jackson.core
杰克逊核心
2.5.1
com.fasterxml.jackson.core
杰克逊数据绑定
2.5.1
com.fasterxml.jackson.core
杰克逊注释
2.5.1

我有@Greg post指定的依赖项。我仍然面临这个问题,可以通过添加以下附加的jackson依赖项来解决它:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.7.4</version>
</dependency>

com.fasterxml.jackson.dataformat
jackson数据格式xml
2.7.4

不完全适用于此操作,但适用于遇到404且无法将响应
内容类型设置为
“application/json”
(任何
内容类型
)的用户。一种可能是服务器实际响应406,但浏览器(如chrome)将其打印为404

如果不自定义消息转换器,spring将使用
AbstractMessageConverterMethodProcessor.java
。它将运行:

List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request);
List<MediaType> producibleMediaTypes = getProducibleMediaTypes(request, valueType, declaredType);

您是否使用@ResponseBody并附带了一些Json映射程序?让我们看看您的方法的其余部分、请求头和完整响应。@SotiriosDelimanolis添加了所有内容。添加您的jackson jar版本和jackson的springMVC配置。我这样做了,但仍然不起作用。这可能与我的配置XML文件有关吗?使用了Gson而不是Jackson,但情况相同。请添加更多详细信息,向我们显示您对控制器的依赖关系和完整代码。我不能谈论此Gson,但我向您保证Jackson确实有效。这可能与Gson有关:,但看起来比jackson付出了更多的努力,这是开箱即用的。这不是配置文件,问题在于Gson。你能试着排除它,用jackson来代替它来测试这篇论文吗?jackson库在@ResponseBody@user3360241带有
@ResponseBody
的Jackson是通过
映射Jackson2HttpMessageConverter实现的。它是在
StringHttpMessageConverter
之后注册的,因此在处理该请求时不起任何作用。Hm:,这也是一个示例。我想说op也希望将自定义对象作为Json返回。@user3360241他们可能希望,但现在他们正在返回一个
字符串。如果他们确实返回了一个POJO,并且假设他们的配置是正确的,那么Jackson将参与其中。如果您希望将字符串作为内容json返回到浏览器,那么这个答案是正确的,正如您在问题中指出的那样。如果您应该返回表示为Json的POJO,那么您应该使用一些映射程序,例如Jackson。如何定制AbstractMessageConverterMethodProcessor?
List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request);
List<MediaType> producibleMediaTypes = getProducibleMediaTypes(request, valueType, declaredType);
"application/json"  
"application/xml"   
"text/xml"          
"application/*+xml" 
"application/json"  
"application/*+json"
"application/json"  
"application/*+json"
"application/xml"   
"text/xml"          
"application/*+xml"
"application/xml"  
"text/xml"         
"application/*+xml"