복붙노트

[SPRING] json 콘텐츠를 반환하지 않는 봄 mvc - 오류 406

SPRING

json 콘텐츠를 반환하지 않는 봄 mvc - 오류 406

Ajax Simplification Spring 3.0에 명시된 JSON과 함께 Spring MVC를 사용하고있다.

여러 가지 시도와 여러 가지 포럼에서 발견 된 조언에 따라 다양한 코드를 사용한 후에도 내 코드는 여전히 작동하지 않습니다.

다음과 같은 오류가 계속 발생합니다 : (406)이 요청으로 식별 된 리소스는 요청 "accept"헤더 ()에 따라 수용 할 수없는 특성을 가진 응답 만 생성 할 수 있습니다.

필요한 경우 appconfig.xml에 있습니다.

app-config.xml

    <context:component-scan base-package="org.ajaxjavadojo" />

    <!-- Configures Spring MVC -->
    <import resource="mvc-config.xml" />

mvc-config.xml

<mvc:annotation-driven />

<!-- Forwards requests to the "/" resource to the "index" view -->
<mvc:view-controller path="/" view-name="index"/>


<!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
  <entry key="html" value="text/html"/>
  <entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<list>
  <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
  </bean>
</list>
</property>

</bean>

이것이 내 컨트롤러에 대한 것입니다.

@Controller
@RequestMapping (value = "/convert")
public class ConversionController {

  @RequestMapping(method=RequestMethod.GET)
  public String getConversionForm(){
    return "convertView";
  }

  @RequestMapping(value = "/working", headers="Accept=application/json", method=RequestMethod.GET)
  public @ResponseBody Conversion getConversion(){
    Conversion d = new Conversion("d");
    return d;
  }
}

jsp jquery 호출

  function convertToDecimal(){
    $.getJSON("convert/working", {key: "r"}, function(aConversion){
      alert("it worked.");
      $('#decimal').val(aConversion.input);
    });
  }

이 문제에 대한 의견을 보내 주시면 감사하겠습니다. 고맙습니다

해결법

  1. ==============================

    1.수락에 대한 헤더 제한을 제거하고 중단 점을 넣어 실제 값을 확인하십시오. 또는 FireBug로이 작업을 수행하십시오.

    수락에 대한 헤더 제한을 제거하고 중단 점을 넣어 실제 값을 확인하십시오. 또는 FireBug로이 작업을 수행하십시오.

    또한이 jquery 문제를 살펴보십시오.

  2. ==============================

    2.@ ResponseBody-annotated 메소드에서 JSON 응답을 리턴하려면 다음 두 가지가 필요합니다.

    @ ResponseBody-annotated 메소드에서 JSON 응답을 리턴하려면 다음 두 가지가 필요합니다.

    @RequestMapping에는 ContentNegotiatingViewResolver 및 헤더가 필요하지 않습니다.

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

    3.3.2.x에서 4.1.x로 Spring을 업그레이드 한 후에이 문제가 발생했습니다. Jackson을 1.9.x에서 2.2.x (fasterxml)로 업그레이드하여 수정했습니다.

    3.2.x에서 4.1.x로 Spring을 업그레이드 한 후에이 문제가 발생했습니다. Jackson을 1.9.x에서 2.2.x (fasterxml)로 업그레이드하여 수정했습니다.

     <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.2.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.2.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.2.3</version>
    </dependency>
    
  4. ==============================

    4.DispatcherServlet-servlet.xml에 org.springframework.http.converter.json.MappingJacksonHttpMessageConverter와 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter를 추가하십시오. 그리고 두 번째에있는 첫 번째 참조를 사용하여

    DispatcherServlet-servlet.xml에 org.springframework.http.converter.json.MappingJacksonHttpMessageConverter와 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter를 추가하십시오. 그리고 두 번째에있는 첫 번째 참조를 사용하여

    <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter"/>
            </list>
        </property>
    </bean>
    
  5. ==============================

    5.나도이 오류가있어 그리고 토끼 구멍에 깊이 디버깅하는 동안이 예외를 건너 왔어.

    나도이 오류가있어 그리고 토끼 구멍에 깊이 디버깅하는 동안이 예외를 건너 왔어.

    그래서 기본적으로 내 자바 빈에서 나는 다음과 같은 것을 가졌다.

    private boolean isError;
    private ErrorModel error;
    
    public ErrorModel getError() {
    return error;
    }
    
    public void setError(ErrorModel error) {
    this.error = error;
    }
    public boolean isError() {
    return isError;
    }
    
    public void setError(boolean isError) {
    this.isError = isError;
    }
    

    오류 구성원 변수 이름 중 하나를 다른 것으로 변경하면 문제가 해결됩니다.

  6. ==============================

    6.나도이 문제를 겪었다. 설정 XML에 을 추가해야한다.

    나도이 문제를 겪었다. 설정 XML에 을 추가해야한다.

    <!-- Jackson -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson.databind-version}</version>
            </dependency>
    

    당신의 pom.xml에

  7. ==============================

    7.나는 자바 구성을 사용하고 나는이 같은 오류가있다. @EnableWebMvc를 구성 파일에 추가하지 않았습니다. 이 오류는 웹 구성 파일에 @EnableWebMvc를 추가 한 후에 해결됩니다.

    나는 자바 구성을 사용하고 나는이 같은 오류가있다. @EnableWebMvc를 구성 파일에 추가하지 않았습니다. 이 오류는 웹 구성 파일에 @EnableWebMvc를 추가 한 후에 해결됩니다.

    또한 Spring Controller에서 리턴 된 Object는 적절한 getter와 setter 메소드를 가져야한다.

    package com.raghu.dashboard.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    
    import com.raghu.dashboard.dao.ITaskDAO;
    import com.raghu.dashboard.dao.TaskDAOImpl;
    
    
        @Configuration
        @EnableWebMvc  //missed earlier...after adding this it works.no 406 error
        @ComponentScan(basePackages = { "com.raghu.dashboard.api", "com.raghu.dashboard.dao" })
        public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    
            protected Class<?>[] getRootConfigClasses() { return null;}
    
            protected Class<?>[] getServletConfigClasses() {
                return new Class[] { MongoConfiguration.class};
            }
    
            protected String[] getServletMappings() {
                return new String[]{"*.htm"}; 
            }
    
            @Bean(name = "taskDao")
            public ITaskDAO taskDao() {
                return new TaskDAOImpl();
            }
    
            @Bean
            public InternalResourceViewResolver getInternalResourceViewResolver() {
                InternalResourceViewResolver resolver = new InternalResourceViewResolver();
                resolver.setPrefix("/WEB-INF/pages/");
                resolver.setSuffix(".jsp");
                return resolver;
            }
    
        }
    

    AppInitializer.java

    package com.raghu.dashboard.config;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRegistration;
    
    import org.springframework.web.WebApplicationInitializer;
    import org.springframework.web.context.ContextLoaderListener;
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
    import org.springframework.web.servlet.DispatcherServlet;
        public class AppInitalizer implements WebApplicationInitializer {
    
            @Override
            public void onStartup(ServletContext servletContext)
                    throws ServletException {
                WebApplicationContext context = getContext();
                servletContext.addListener(new ContextLoaderListener(context));
                ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
                dispatcher.setLoadOnStartup(1);
                dispatcher.addMapping("/*");
            }
    
            private AnnotationConfigWebApplicationContext getContext() {
                AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
                context.register(com.raghu.dashboard.config.WebConfig.class);
                context.scan("com.raghu.dashboard.api");
                return context;
            }
    
        }
    

    또한 반환되는 Object가 적절한 getter와 setter인지 확인하십시오.

    예:

    @RequestMapping(value = "/list", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public ResponseEntity<TaskInfo> findAll() {
        logger.info("Calling the findAll1()");
        TaskInfo taskInfo = dashboardService.getTasks();
        HttpHeaders headers = new HttpHeaders();
        headers.add("Access-Control-Allow-Origin", "*");
        ResponseEntity<TaskInfo> entity = new ResponseEntity<TaskInfo>(taskInfo,
                headers, HttpStatus.OK);
        logger.info("entity is := " + entity);
        return entity;
    }
    

    TaskInfo 객체에는 적절한 getter 및 setter가 있어야합니다. 그렇지 않으면 406 오류가 발생합니다.

    참조 용 POM 파일 :

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.raghu.DashBoardService</groupId>
        <artifactId>DashBoardService</artifactId>
        <packaging>war</packaging>
        <version>0.0.1-SNAPSHOT</version>
        <name>DashBoardService Maven Webapp</name>
        <url>http://maven.apache.org</url>
        <properties>
            <!-- Spring -->
            <spring-framework.version>4.0.6.RELEASE</spring-framework.version>
            <jackson.version>2.4.0</jackson.version>
            <jaxb-api.version>2.2.11</jaxb-api.version>
            <log4j.version>1.2.17</log4j.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.mongodb</groupId>
                <artifactId>mongo-java-driver</artifactId>
                <version>2.10.1</version>
            </dependency>
            <!-- Spring Data Mongo Support -->
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-mongodb</artifactId>
                <version>1.4.1.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>3.1</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-dao</artifactId>
        <version>2.0.3</version>
    </dependency>
    
    
    
            <!-- Jackson mapper -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.2.3</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.2.3</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.2.3</version>
            </dependency>
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.0.1</version>
            </dependency>
    
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>1.7.1</version>
            </dependency>
    
            <!-- Log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-commons</artifactId>
                <version>1.5.0.RELEASE</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <finalName>DashBoardService</finalName>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.6</version>
                    <configuration>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
  8. ==============================

    8.문제는 jquery와 관련이 없습니다. 심지어 버그는 그것이 서버 측 문제라고 말하고 있습니다. 클래스 경로에 다음 2 개의 병이 있는지 확인하십시오.

    문제는 jquery와 관련이 없습니다. 심지어 버그는 그것이 서버 측 문제라고 말하고 있습니다. 클래스 경로에 다음 2 개의 병이 있는지 확인하십시오.

    Jackson-core-real-1.9x Jackson-size-real-1.9x

  9. ==============================

    9.나는 또한이 똑같은 문제에 직면했고 나는이 [jar]를 다운로드했다 : (http://www.java2s.com/Code/Jar/j/Downloadjacksonall190jar.htm)! lib 폴더에 배치하고 응용 프로그램은 매력처럼 작동합니다 :)

    나는 또한이 똑같은 문제에 직면했고 나는이 [jar]를 다운로드했다 : (http://www.java2s.com/Code/Jar/j/Downloadjacksonall190jar.htm)! lib 폴더에 배치하고 응용 프로그램은 매력처럼 작동합니다 :)

  10. ==============================

    10.Spring MVC가 URI의 확장을 해석하고 장면 뒤에 생성 된 예상 MIME 유형을 변경함으로써 비슷한 문제점에 대한 나의 답을 볼 수있다. 따라서 406을 생성한다.

    Spring MVC가 URI의 확장을 해석하고 장면 뒤에 생성 된 예상 MIME 유형을 변경함으로써 비슷한 문제점에 대한 나의 답을 볼 수있다. 따라서 406을 생성한다.

  11. ==============================

    11.axtavt가 말했듯이 mvc : annotation-driven 및 jackson JSON 매퍼 만 있으면됩니다. 컨트롤러에서 반환하는 객체에 @XmlRootElement 및 @XmlElement가있는 경우 코드를 변경하지 않고 JSON과 XML 문자열을 동일한 메서드에서 반환하도록 응용 프로그램을 만들었습니다. 차이점은 요청이나 헤더에 전달 된 accept 매개 변수에 있습니다. xml을 반환하려면 브라우저에서 정상적으로 호출하면됩니다. 그렇지 않으면 accept를 'application / xml'으로 전달합니다. JSON을 반환하려면 request의 accept 매개 변수에 'application / json'을 사용하십시오.

    axtavt가 말했듯이 mvc : annotation-driven 및 jackson JSON 매퍼 만 있으면됩니다. 컨트롤러에서 반환하는 객체에 @XmlRootElement 및 @XmlElement가있는 경우 코드를 변경하지 않고 JSON과 XML 문자열을 동일한 메서드에서 반환하도록 응용 프로그램을 만들었습니다. 차이점은 요청이나 헤더에 전달 된 accept 매개 변수에 있습니다. xml을 반환하려면 브라우저에서 정상적으로 호출하면됩니다. 그렇지 않으면 accept를 'application / xml'으로 전달합니다. JSON을 반환하려면 request의 accept 매개 변수에 'application / json'을 사용하십시오.

    firefox를 사용하는 경우 tamperdata를 사용하고이 매개 변수를 변경할 수 있습니다.

  12. ==============================

    12.jQuery를 사용하여 contentType을 원하는 (application / json; charset = UTF-8 ') 여기에 설정하고 서버 쪽에서 같은 헤더를 설정할 수 있습니다.

    jQuery를 사용하여 contentType을 원하는 (application / json; charset = UTF-8 ') 여기에 설정하고 서버 쪽에서 같은 헤더를 설정할 수 있습니다.

    테스팅 중에 캐시를 지우는 것을 기억하십시오.

  13. ==============================

    13.@RequestMapping (..., = "application / json")을 사용하여 @RequestMapping (... headers = "Accept = application / json"...)

    @RequestMapping (..., = "application / json")을 사용하여 @RequestMapping (... headers = "Accept = application / json"...)

  14. ==============================

    14.글쎄,이 페이지의 답변은 맞을지 모르지만 그들은 잘 외과하지 않았다. 이것이 내가 한 일이다.

    글쎄,이 페이지의 답변은 맞을지 모르지만 그들은 잘 외과하지 않았다. 이것이 내가 한 일이다.

    나는 이것을 pom.xml에 추가했다.

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.8</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.8</version>  
    </dependency>
    

    그런 다음 아래처럼 RequestMapping에 헤더를 추가했습니다.

    @RequestMapping(value="/admin/getGallery", method = RequestMethod.GET, headers={"Content-Type=application/json"})
    

    그런 다음 jquery jQuery에서 contentType : "application / json"을 추가 했으므로

    jQuery.ajax({
                type:'GET',
                url:"getGallery.html",
                data: "designId="+designId,
                processData:false,
                contentType: "application/json",
                //dataType: "json",
               success:function(data){
                  console.log(data);
    
               },
                error : function(e) {
                    console.log("ERROR: ", e);
                },
            });
    

    그런 다음 내 서블릿에서

    <bean id="jsonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
        <!-- Bind the return value of the Rest service to the ResponseBody. -->
        <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
        <util:list id="beanList">
        <ref bean="jsonHttpMessageConverter" />
        </util:list>
        </property>
    </bean> 
    

    서블릿에서 util 태그에 문제가있는 경우 동일한 서블릿 파일을 추가하기 만하면됩니다.

    xmlns:util="http://www.springframework.org/schema/util"
    

    xsi:schemaLocation="http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util-3.0.xsd
    
  15. from https://stackoverflow.com/questions/4069903/spring-mvc-not-returning-json-content-error-406 by cc-by-sa and MIT license