我对杰克逊有一个问题,我认为应该很容易解决,但这让我很生气。
我有一个看起来像这样的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
谢谢你。