2

我对杰克逊有一个问题,我认为应该很容易解决,但这让我很生气。

我有一个看起来像这样的java POJO类(带有getter和setter)

@JsonRootName(value = "notificacion")
public class NotificacionDTO extends AbstractDTO {

@JsonProperty(required=true)
private Integer instalacion;

@JsonProperty(required=true)
private Integer tipoNotificacion;

@JsonProperty(required=true)
private String mensaje;
}

这是 AbstractDTO

public abstract class AbstractDTO implements Serializable {

public void validate() {
    Field[] declaredFields = this.getClass().getDeclaredFields();

    for (Field field : declaredFields) {
        if (field.isAnnotationPresent(JsonProperty.class)){
            if (field.getAnnotation(JsonProperty.class).required() && this.isNullParameter(field)) {
                throw new RuntimeException(String.format("El parametro %s es null o no esta presente en el JSON.", field.getName()));
            }
        }
    }
}

private boolean isNullParameter(Field field) {
    try {
        field.setAccessible(true);
        Object value = field.get(this);

        if (value == null) {
            return true;
        } else if (field.getType().isAssignableFrom(String.class)) {
            return ((String) value).isEmpty();
        }
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return false;
}
}

我想将看起来像这样的 JSON 反序列化为 NotificacionDTO 对象:

{
  "notificacion":
  {
     "instalacion":"1",
     "tipoNotificacion":"2",
     "mensaje":"Un Mensaje"
  }
}

这是我的端点

@Controller
@RequestMapping("/notificacion")
public class NotificacionEndPoint extends AbstractEndPoint{

@Autowired
private NotificacionService service;

@RequestMapping(value = {"", "/"}, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void addNotification(@RequestBody NotificacionDTO notification) throws JsonParseException, JsonMappingException, IOException {
        this.log.info("[POST RECEIVED] = " + notification);

        notification.validate();

        this.service.addNotification(notification);
}
}

我有一个自定义的 ObjectMapper

public class JsonObjectMapper extends ObjectMapper {

public JsonObjectMapper() {
    super();

    this.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
}
}

当我发布时,我收到了这个错误

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:  Unrecognized field "notificacion" (class ar.com.tecnoaccion.services.notificacion.NotificacionDTO), not marked as ignorable (3 known properties: , "tipoNotificacion", "instalacion", "mensaje"])
at [Source: org.apache.catalina.connector.CoyoteInputStream@1c1f3f7; line: 3, column:  5] (through reference chain: ar.com.tecnoaccion.services.notificacion.NotificacionDTO["notificacion"])

我尝试将此添加到我的 DTO

 @JsonIgnoreProperties(ignoreUnknown = true)

但是当我使用 validate 方法验证我的 DTO 时,所有 dto 的属性都为空,我收到此错误:

 java.lang.RuntimeException: El parametro instalacion es null o no esta presente en el JSON.

我正在使用杰克逊 2.2.3 和弹簧 3.2.1

谢谢你。

4

1 回答 1

2

简单的答案是发布

{
 "instalacion":"1",
 "tipoNotificacion":"2",
 "mensaje":"Un Mensaje"
}

代替

{
 "notificacion":
  {
   "instalacion":"1",
   "tipoNotificacion":"2",
   "mensaje":"Un Mensaje"
  }
}
于 2013-10-16T22:39:13.663 回答