web-dev-qa-db-de.com

spring mvc gibt keinen json-inhalt zurück - fehler 406

Ich verwende Spring MVC mit JSON, wie in Ajax Simplification Spring 3.0-Artikel angegeben.

Nach so vielen Versuchen und Variationen meines Codes, abhängig von Ratschlägen in verschiedenen Foren, funktioniert mein Code immer noch nicht.

Ich erhalte weiterhin den folgenden Fehler: (406) Die durch diese Anforderung identifizierte Ressource kann nur Antworten mit Merkmalen generieren, die gemäß dem Header "(Accept") der Anforderung nicht akzeptabel sind.

Ich habe in meiner appconfig.xml nach Bedarf.

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>

Das ist was ich für meinen Controller habe

@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 Anruf

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

Ich würde mich sehr über jeden Beitrag zu diesem Thema freuen. Vielen Dank

26
serena

Entfernen Sie die Kopfbeschränkung für Accept, setzen Sie einen Haltepunkt und sehen Sie, was der tatsächliche Wert ist. Oder machen Sie das mit FireBug.

Werfen Sie auch einen Blick auf diese Jquery-Ausgabe

8
Bozho

Um eine JSON-Antwort von der @ResponseBody-kommentierten Methode zurückzugeben, benötigen Sie zwei Dinge:

Sie brauchen ContentNegotiatingViewResolver und headers nicht in @RequestMapping.

23
axtavt

Ich hatte dieses Problem, nachdem ich Spring auf 3.2.x von 3.2.x aufgerüstet habe. Ich habe das Problem behoben, indem ich ein Upgrade von Jackson von 1.9.x auf 2.2.x durchgeführt habe (itzerxml)

 <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>
18
jprism

Fügen Sie org.springframework.http.converter.json.MappingJacksonHttpMessageConverter und org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter zu DispatcherServlet-servlet.xml hinzu. und beziehen sich auf die erste in der zweiten Verwendung 

<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>
8
Thomas

Ich bekam auch diesen Fehler und beim Debuggen tief in das Kaninchenloch stieß ich auf diese Ausnahme

Java.lang.IllegalArgumentException: Widersprüchliche Getterdefinitionen für die Eigenschaft "error": com.mycomp.model.OutputJsonModel # isError (0 Parameter) vs com.mycomp.model.OutputJsonModel # getError (0 Parameter)

Im Grunde hatte ich in meinem Java Bean so etwas wie das Folgende:

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;
}

Durch Ändern eines der Variablennamen der Error-Member in etwas anderes wurden die Probleme behoben.

3
user320550

Ich hatte auch dieses Problem, Sie müssen <mvc:annotation-driven /> in Ihre Konfigurations-XML einfügen

und 

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

in deiner pom.xml

2
Stefanos T.

Ich habe Java-Konfiguration verwendet, und ich habe den gleichen Fehler erhalten. Ich habe es versäumt, @EnableWebMvc zur Konfigurationsdatei hinzuzufügen. Dieser Fehler wurde behoben, nachdem ich @EnableWebMvc in meiner webconfig-Datei hinzugefügt habe.

Auch das Objekt, das von Ihrem Spring Controller zurückgegeben wird, sollte über korrekte Getter- und Setter-Methoden verfügen.

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;
        }

    }

Stellen Sie außerdem sicher, dass das zurückgegebene Objekt den richtigen Getter und Setter enthält.

Beispiel:

@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;
}

Das TaskInfo-Objekt sollte einen richtigen Getter und Setter haben. Andernfalls wird der Fehler 406 ausgegeben.

POM-Datei als Referenz:

<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>
2
Raghu

Nun, die Antworten auf dieser Seite sind vielleicht richtig, aber sie sind nicht gut gegangen. Das habe ich getan

Ich habe dies zu meiner pom.xml hinzugefügt

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

Dann fügte ich meinem RequestMapping wie unten Header hinzu

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

Dann fügte ich in meinem jquery ajax hinzu - contentType: "application/json", so sieht es aus

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);
            },
        });

Dann fügte ich in meinem Servlet hinzu

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

Wenn Sie ein Problem mit dem util-Tag in Ihrem Servlet haben, fügen Sie einfach dieselbe Servlet-Datei hinzu

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

und

xsi:schemaLocation="http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
1
Yinka

problem bezieht sich nicht auf Jquery. Selbst ein Fehler besagt, dass es sich um ein serverseitiges Problem handelt. Stellen Sie sicher, dass die folgenden 2 Gläser im Klassenpfad vorhanden sind: - 

jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar

1
Raju Rathi

Siehe meine Antwort auf ein ähnliches Problem hier mit Spring MVC interpretiert die Erweiterung der URI und ändert den erwarteten MIME-Typ, der hinter den Kulissen erzeugt wird, und erzeugt somit eine 406.

1
Jérémie

Ich stand auch vor demselben Problem und habe dieses [jar] heruntergeladen: ( http://www.Java2s.com/Code/Jar/j/Downloadjacksonall190jar.htm )! und in lib Ordner platziert und die App funktioniert wie ein Zauber :) 

1

Anstelle von @RequestMapping(...headers="Accept=application/json"...) verwenden Sie @RequestMapping(... , produces = "application/json")

0

Mit jQuery können Sie contentType auf den gewünschten Typ (application/json; charset = UTF-8 'hier) setzen und den gleichen Header auf der Serverseite festlegen. 

Denken Sie daran, die CACHE während des Tests zu löschen.

0
user3055311

Wie von axtavt gesagt, sind mvc: annotation-driven und jackson JSON Mapper alles, was Sie brauchen. Ich folgte dem und ließ meine Anwendung JSON- und XML-Strings aus derselben Methode zurückgeben, ohne Code zu ändern, vorausgesetzt, es befinden sich @XmlRootElement und @XmlElement in dem Objekt, das Sie vom Controller zurückgeben. Der Unterschied bestand im Accept-Parameter, der in der Anforderung oder im Header übergeben wurde. Bei der Rückgabe von XML erfolgt dies bei jedem normalen Aufruf des Browsers, andernfalls übergeben Sie das Accept als 'application/xml'. Wenn Sie möchten, dass JSON zurückgegeben wird, verwenden Sie 'application/json' im Parameter 'Accept' in request. 

Wenn Sie Firefox verwenden, können Sie Tamperdata verwenden und diesen Parameter ändern

0
Iceman