Bir JSON isteği almaya ve işlemeye çalışırken aşağıdaki hatayı alıyorum:
org.codehaus.jackson.map.JsonMappingException: Tip [simple type, class com.myweb.ApplesDO] için uygun kurucu bulunamadı: JSON nesnesinden örneklenemiyor (tip bilgisi eklemek/etkinleştirmek gerekiyor mu?)
İşte göndermeye çalıştığım JSON:
{
"applesDO" : [
{
"apple" : "Green Apple"
},
{
"apple" : "Red Apple"
}
]
}
Controller'da aşağıdaki yöntem imzasına sahibim:
@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
// Method Code
}
AllApplesDO, ApplesDO'nun bir sarmalayıcısıdır:
public class AllApplesDO {
private List<ApplesDO> applesDO;
public List<ApplesDO> getApplesDO() {
return applesDO;
}
public void setApplesDO(List<ApplesDO> applesDO) {
this.applesDO = applesDO;
}
}
ApplesDO:
public class ApplesDO {
private String apple;
public String getApple() {
return apple;
}
public void setApple(String appl) {
this.apple = apple;
}
public ApplesDO(CustomType custom){
//constructor Code
}
}
Jackson'ın alt sınıflar için JSON'u Java nesnelerine dönüştüremediğini düşünüyorum. Lütfen Jackson'ın JSON'u Java Nesnelerine dönüştürmesi için yapılandırma parametreleri konusunda yardımcı olun. Spring Framework kullanıyorum.
DÜZENLEME: Yukarıdaki örnek sınıfta bu soruna neden olan büyük hata dahil edildi - Lütfen çözüm için kabul edilen yanıta bakın.
Sonunda sorunun ne olduğunu anladım. Şüphe ettiğim gibi bu bir Jackson yapılandırma sorunu değil.
Aslında sorun ApplesDO sınıfındaydı:
public class ApplesDO {
private String apple;
public String getApple() {
return apple;
}
public void setApple(String apple) {
this.apple = apple;
}
public ApplesDO(CustomType custom) {
//constructor Code
}
}
Sınıf için tanımlanmış özel bir kurucu vardı ve bunu varsayılan kurucu haline getiriyordu. Sahte bir kurucunun eklenmesi hatanın ortadan kalkmasını sağladı:
public class ApplesDO {
private String apple;
public String getApple() {
return apple;
}
public void setApple(String apple) {
this.apple = apple;
}
public ApplesDO(CustomType custom) {
//constructor Code
}
//Introducing the dummy constructor
public ApplesDO() {
}
}
Bu, şu nedenlerden dolayı gerçekleşir:
iç sınıfınız statik olarak tanımlanmalıdır
private static class Koşul { //jackson'a özgü
}
Sınıfınızda varsayılan kurucunuz olmayabilir (GÜNCELLEME: Durum böyle görünmüyor)
private static class Koşul {
private Long id;
public Koşul() {
}
// Ayarlayıcılar ve Getiriciler
}
Setter'larınız düzgün tanımlanmamış veya görünmüyor olabilir (örn. private setter)
Lütfen bu yapıyı test edebilir misiniz? Eğer doğru hatırlıyorsam bu şekilde kullanabilirsiniz:
{
"applesRequest": {
"applesDO": [
{
"apple": "Green Apple"
},
{
"apple": "Red Apple"
}
]
}
}
İkinci olarak, lütfen her sınıfa varsayılan kurucu ekleyin, bu da yardımcı olabilir.