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.
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.
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.
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.
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.
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.
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')
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();
}
}
}
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.
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.
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;
}
.......
.......
.......
Ich hatte das gleiche Problem. Die Hauptursache war die Verwendung eines benutzerdefinierten Deserializers ohne Standardkonstruktor.
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>
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.