wake-up-neo.net

Frühling Rest POST Json RequestBody-Inhaltstyp wird nicht unterstützt

Wenn ich versuche, ein neues Objekt mit der Post-Methode zu posten. RequestBody konnte contentType nicht erkennen. Spring ist bereits konfiguriert und POST kann mit anderen Objekten arbeiten, nicht jedoch mit diesem.

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

Wenn ich dieselbe Anfrage versuche, einfach das Anfragekörperobjekt ändern. Es klappt.

43
Thibaut

Ich habe eine Lösung gefunden ... Es war, weil ich 2 Setter mit gleichem Namen, aber anderem Typ hatte.

Meine Klasse hatte die id - Eigenschaft int, die ich durch Integer ersetzt habe, wenn mein Objekt Hibernitify ist.

Aber anscheinend habe ich vergessen, Setter zu entfernen, und ich hatte:

/**
 * @param id
 *            the id to set
 */
public void setId(int id) {
    this.id = id;
}

/**
 * @param id
 *            the id to set
 */
public void setId(Integer id) {
    this.id = id;
}

Wenn ich diesen Setter entfernt habe, funktioniert die Ruhezustellung sehr gut.

Legt fest, dass ein Fehler beim Rangieren ausgegeben wird oder Klassenfehler angezeigt werden. Die Ausnahme HttpMediaTypeNotSupportedException wirkt hier sehr merkwürdig.

Ich hoffe, dieser Stackoverflow könnte jemand anderem helfen.

RANDNOTIZ

Sie können Ihre Spring Server Konsole auf folgende Fehlermeldung überprüfen:

Die Deserialisierung von Jackson konnte für Typ [einfacher Typ, class your.package.ClassName]: com.fasterxml.jackson.databind.JsonMappingException: Konflikt Setterdefinitionen für Eigenschaft "Eigenschaftsname"

Dann können Sie sicher sein, dass Sie sich mit dem oben genannten Problem befassen.

60
Thibaut

Beachten Sie auch, ob Sie Getter und Setter für Attribute des Parameters deklariert haben, die nicht in POST gesendet werden (Ereignis, wenn sie nicht im Konstruktor deklariert sind), z.

@RestController
public class TestController {

    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public String test(@RequestBody BeanTest beanTest) {
        return "Hello " + beanTest.getName();
    }


    public static class BeanTest {

        private Long id;
        private String name;

        public BeanTest() {
        }

        public BeanTest(Long id) {
            this.id = id;
        }

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

Eine Post-Anfrage mit der nächsten Struktur: {"id": "1"} würde nicht funktionieren, Sie müssen den Namen get und set löschen.

6
alvgarvilla

Ja wirklich! nach 4 stunden und wahnsinnigem debuggen fand ich diesen sehr merkwürdigen code bei com.fasterxml.jackson.databind.deser.DeserializerCache

if (deser == null) {
    try {
        deser = _createAndCacheValueDeserializer(ctxt, factory, type);
    } catch (Exception e) {
        return false;
    }
}

Ja, das Problem war doppelter Setter.

3
Reza Shahbazi

Wenn Sie Lombok verwenden, können Sie diesen Fehler erhalten, wenn Sie die Benennung von @JsonDeserialize vermasseln. Beispiel:

@Value
@Builder(toBuilder = true)
@JsonDeserialize(builder = SomeClass.SomeOtherClassBuilder.class)
public class SomeClass {
    ...
    public static class SomeOtherClassBuilder {
        ...
    }
}

Es sollte sein:

@Value
@Builder(toBuilder = true)
@JsonDeserialize(builder = SomeClass.SomeClassBuilder.class)
public class SomeClass {
    ...
    public static class SomeClassBuilder {
        ...
    }
}

Es ist sehr einfach, dies zu tun, wenn Sie den Klassennamen umgestalten und den Builder vergessen ... und dann haben Sie viele Stunden Freude, wenn Sie nach einem Fehler suchen, und dabei nur äußerst wenig hilfreiche Ausnahmemeldungen haben.

3
Mader Levap

Ich traf das gleiche Problem, das ich durch Deserialisierung des angegebenen Wertes gelöst habe:

@RequestMapping(value = "/arduinos/commands/{idArduino}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String sendCommandesJson(@PathVariable("idArduino") String idArduino, HttpServletRequest request) throws IOException {
    // getting the posted value
    String body = CharStreams.toString(request.getReader());
    List<ArduinoCommand> commandes = new ObjectMapper().readValue(body, new TypeReference<List<ArduinoCommand>>() {
    });

mit diesen grades Abhängigkeiten:

  compile('org.springframework.boot:spring-boot-starter-web')
  compile('com.google.guava:guava:16.0.1')
1
Serge Tahé

Ich hatte also ein ähnliches Problem, bei dem ich eine Bean mit überladenem Konstruktor hatte. Diese Bohne hatte auch optionale Eigenschaften.

Um das zu beheben, habe ich einfach die überladenen Konstruktoren entfernt und es hat funktioniert.

beispiel:

public class Bean{

Optional<String> string;
Optional<AnotherClass> object;

public Bean(Optional<String> str, Optional<AnotherClass> obj){
string = str;
object = obj;
}

///The problem was below constructor

public Bean(Optional<String> str){
string = str;
object = Optional.empty();
}



}

}
1
user_CC

Ich hatte das gleiche Problem, als ich zwei Setter hatte, einen mit Enum und einen String. Ich musste die @JsonSetter-Annotation verwenden, die Jackson mitteilt, welche Setter-Methode während der Serialisierung verwendet werden soll. Das hat mein Problem gelöst.

1

In meinem Fall hatte ich zwei Konstruktoren in der Bean und ich hatte den gleichen Fehler. Ich habe gerade eine davon gelöscht und das Problem ist behoben.

1
osoitza

geben Sie @JsonProperty wie folgt im Entitätsklassenkonstruktor an.

......
......
......

 @JsonCreator
 public Location(@JsonProperty("sl_no") Long sl_no, 
          @JsonProperty("location")String location,
          @JsonProperty("location_type") String 
          location_type,@JsonProperty("store_sl_no")Long store_sl_no) {
  this.sl_no = sl_no;
  this.location = location;
  this.location_type = location_type;
  this.store_sl_no = store_sl_no;
 } 
.......
.......
.......
0
Kiran Kumar A

Ich hatte das gleiche Problem. Die Hauptursache war die Verwendung eines benutzerdefinierten Deserializers ohne Standardkonstruktor.

0
gstackoverflow

versuchen Sie, die Abhängigkeit von Jackson hinzuzufügen

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.3</version>
    </dependency>

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

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.3</version>
        <exclusions>
            <exclusion>
                <artifactId>jackson-annotations</artifactId>
                <groupId>com.fasterxml.jackson.core</groupId>
            </exclusion>
        </exclusions>
    </dependency>
0
Aborn Jiang

Es sieht aus wie ein alter Faden, aber falls jemand noch Probleme hat, habe ich es gelöst, als Thibaut es sagte: 

Vermeiden Sie zwei Setzer-POJO-Klassen. Ich hatte zwei Setzer für eine bestimmte Eigenschaft. Der erste war im regulären Setzer und ein weiterer im Konstruktor, nachdem ich denjenigen in dem Konstruktor entfernt hatte, in dem er arbeitete.

0
Dan