복붙노트

[SPRING] Spring MVC 4 : "application / json"콘텐츠 유형이 올바르게 설정되지 않았습니다.

SPRING

Spring 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. ==============================

    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. ==============================

    2.컨트롤러의 반환 유형에 jackson 라이브러리 및 @ResponseBody 주석을 사용합니다.

    컨트롤러의 반환 유형에 jackson 라이브러리 및 @ResponseBody 주석을 사용합니다.

    이것은 JSon으로 표현 된 POJO를 반환하고자 할 때 작동한다. JSON으로 POJO가 아닌 String을 반환하려는 경우 Sotirious answer를 참조하십시오.

  3. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    6.내가 지정한 @Greg 게시와 같은 종속성을 가졌다. 나는 여전히이 문제에 직면하여 다음과 같은 추가 잭슨 의존성을 추가하여 문제를 해결할 수있었습니다.

    내가 지정한 @Greg 게시와 같은 종속성을 가졌다. 나는 여전히이 문제에 직면하여 다음과 같은 추가 잭슨 의존성을 추가하여 문제를 해결할 수있었습니다.

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.7.4</version>
    </dependency>
    
  7. 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