[SPRING] Spring MVC 4 : "application / json"콘텐츠 유형이 올바르게 설정되지 않았습니다.
SPRINGSpring MVC 4 : "application / json"콘텐츠 유형이 올바르게 설정되지 않았습니다.
다음 주석으로 매핑 된 컨트롤러가 있습니다.
@RequestMapping(value = "/json", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public String bar() {
return "{\"test\": \"jsonResponseExample\"}";
}
그러나 유효한 JSON 문자열을 반환합니다. 브라우저에서 Chrome Dev Tools에 대한 응답을 볼 때 content-type은 application / json이 아니라 일반 텍스트 / 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>
내 dispatcher-servlet.xml :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<context:annotation-config />
<context:component-scan base-package="com.mydomain.controllers" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
WildFly 8.1을 내 응용 프로그램 서버로 사용.
해결법
-
==============================
1.이해해야 할 첫 번째 사항은 RequestMapping # creates () 요소가
이해해야 할 첫 번째 사항은 RequestMapping # creates () 요소가
@RequestMapping(value = "/json", method = RequestMethod.GET, produces = "application/json")
요청 처리기에 대한 매핑을 제한하는 역할 만합니다. 그것은 아무것도하지 않습니다.
그런 다음 메서드에 String 반환 형식이 있고 @ResponseBody 주석이 있으면 반환 값은 Content-type 헤더를 text / plain으로 설정하는 StringHttpMessageConverter에 의해 처리됩니다. JSON 문자열을 직접 반환하고 헤더를 application / json으로 설정하려면 반환 유형 ResponseEntity (@ResponseBody 제거)를 사용하고 적절한 헤더를 추가하십시오.
@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); }
참고로
<mvc:annotation-driven />
서블릿 컨텍스트 구성에서 MVC 구성을 가장 적합한 기본값으로 설정하십시오.
-
==============================
2.컨트롤러의 반환 유형에 jackson 라이브러리 및 @ResponseBody 주석을 사용합니다.
컨트롤러의 반환 유형에 jackson 라이브러리 및 @ResponseBody 주석을 사용합니다.
이것은 JSon으로 표현 된 POJO를 반환하고자 할 때 작동한다. JSON으로 POJO가 아닌 String을 반환하려는 경우 Sotirious answer를 참조하십시오.
-
==============================
3.다른 사람들이 주석을 달았 기 때문에, 당신의 메소드의 리턴 타입이 String이기 때문에 Spring은 그 결과로 아무 것도 할 필요가 없다고 느낍니다.
다른 사람들이 주석을 달았 기 때문에, 당신의 메소드의 리턴 타입이 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; }
-
==============================
4.이 OP에만 해당되는 것은 아니지만 404를 만나면 "application / json"(모든 content-type)에 응답 content-type을 설정할 수 없습니다. 한 가지 가능성은 서버가 실제로 406에 응답하지만 탐색기 (예 : 크롬)는이를 404로 인쇄합니다.
이 OP에만 해당되는 것은 아니지만 404를 만나면 "application / json"(모든 content-type)에 응답 content-type을 설정할 수 없습니다. 한 가지 가능성은 서버가 실제로 406에 응답하지만 탐색기 (예 : 크롬)는이를 404로 인쇄합니다.
메시지 변환기를 사용자 정의하지 않으면 Spring은 AbstractMessageConverterMethodProcessor.java를 사용합니다. 다음과 같이 실행됩니다.
List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request); List<MediaType> producibleMediaTypes = getProducibleMediaTypes(request, valueType, declaredType);
중복되는 항목 (동일한 항목)이 없으면 HttpMediaTypeNotAcceptableException이 발생하고 결국 406이 발생합니다. 요청 URL이 .html로 끝나는 경우 Ajax 또는 GET / POST 또는 양식 작업에 관계없이 문제가 발생합니다. 또는 임의의 접미사를 사용하는 경우 requestedMediaTypes는 "text / [해당 접미사]"가되며 일반적으로 producibleMediaTypes와 충돌합니다.
"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"
-
==============================
5.Spring 4로 업그레이드했을 때 다음과 같이 jackson 종속성을 업데이트해야했습니다.
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>
-
==============================
6.내가 지정한 @Greg 게시와 같은 종속성을 가졌다. 나는 여전히이 문제에 직면하여 다음과 같은 추가 잭슨 의존성을 추가하여 문제를 해결할 수있었습니다.
내가 지정한 @Greg 게시와 같은 종속성을 가졌다. 나는 여전히이 문제에 직면하여 다음과 같은 추가 잭슨 의존성을 추가하여 문제를 해결할 수있었습니다.
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.7.4</version> </dependency>
from https://stackoverflow.com/questions/30548822/spring-mvc-4-application-json-content-type-is-not-being-set-correctly by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Thymeleaf와 JSP 모두 사용하기 (0) | 2018.12.31 |
---|---|
[SPRING] create-session stateless 사용법 (0) | 2018.12.31 |
[SPRING] 봄과 XML 및 자바 구성을 혼합 (0) | 2018.12.30 |
[SPRING] Spring MVC에서 뷰를 렌더링 할 때 발생하는 예외를 처리하는 방법은 무엇입니까? (0) | 2018.12.30 |
[SPRING] oauth / token 요청에 대해 OPTIONS HTTP 메소드 허용 (0) | 2018.12.30 |