Support case where element and attribute have same name

Abierto
#555 4 comentarios 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
30/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
java
Área
backend

Línea de trabajo

Comienza reproduciendo el fallo con XmlMapper.readValue usando las clases Work y Status y las dos asignaciones @JacksonXmlProperty mostradas en el issue. Sigue la InvalidDefinitionException a través del procesamiento de propiedades para determinar cómo deben distinguirse un atributo y un elemento con el mismo nombre y, después, verifica que el XML de ejemplo se deserializa sin el conflicto indicado.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

most-wanted name-collision
We are using jackson-dataformat-xml to convert an XML to JavaObject. Our use case is very peculiar such that the name of the attribute and element are the same in our XML. See the below sample.

<Work Status = "100"> <Status Description = "Hello" Status = "1100"/> </Work>

JavaObject:

`@XmlRootElement
public class Work {

@JacksonXmlProperty(localName = "Status", isAttribute = true)
String status;

@JacksonXmlProperty(localName = "Status", isAttribute = false)
Status status_1;

@JacksonXmlRootElement
static class Status {
    
    @JacksonXmlProperty(localName = "Status", isAttribute = true)
    String status;
}

}`

Implementation:

XmlMapper xmlMapper = new XmlMapper();
        try {
            Work workOrder = xmlMapper.readValue(sample, Work.class);
            System.out.println(workOrder.toString());
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }

Errors:

Exception in thread "main" java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Multiple fields representing property "Status": com.example.demo.Work#status vs com.example.demo.Work#status_1
 at [Source: (StringReader); line: 1, column: 1]
	at com.example.demo.DemoApplication.main(DemoApplication.java:23)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Multiple fields representing property "Status": com.example.demo.Work#status vs com.example.demo.Work#status_1
 at [Source: (StringReader); line: 1, column: 1]
	at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:62)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:268)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:150)
	at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:415)
	at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:350)
	at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
	at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
	at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
	at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:642)
	at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4805)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4675)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3629)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3597)
	at com.example.demo.DemoApplication.main(DemoApplication.java:20)
Caused by: java.lang.IllegalArgumentException: Multiple fields representing property "Status": com.example.demo.Work#status vs com.example.demo.Work#status_1
	at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getField(POJOPropertyBuilder.java:627)
	at com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition.getAccessor(BeanPropertyDefinition.java:190)
	at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder._getSetterInfo(POJOPropertyBuilder.java:265)
	at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getMetadata(POJOPropertyBuilder.java:242)
	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._anyIndexed(POJOPropertiesCollector.java:1238)
	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._sortProperties(POJOPropertiesCollector.java:1140)
	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:470)
	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getPropertyMap(POJOPropertiesCollector.java:386)
	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getProperties(POJOPropertiesCollector.java:233)
	at com.fasterxml.jackson.databind.introspect.BasicBeanDescription._properties(BasicBeanDescription.java:164)
	at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findProperties(BasicBeanDescription.java:239)
	at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCreatorsFromProperties(BasicDeserializerFactory.java:328)
	at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:272)
	at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:223)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:261)
	... 12 more
  • Dependency:
         <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.11.1</version>
        </dependency>
Lenguaje dominante
Java
Estrellas
636
Forks
250
Merge medio
7 h 10 min
PR fusionados (30 d)
8

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de FasterXML/jackson-dataformat-xml

Todos los issues de FasterXML/jackson-dataformat-xml

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.