sirve showmessagedialog settitle que para example ejemplos ejemplo java netbeans jackson lombok

showmessagedialog - para que sirve settitle en java



No puedo hacer que Jackson y Lombok trabajen juntos (9)

Estaba teniendo problemas para hacer que Lombok no agregara la anotación de ConstructorProperies así que fui por el otro lado e impidió que Jackson mirara esa anotación.

El culpable es JacksonAnnotationIntrospector.findCreatorAnnotation . Darse cuenta:

public JacksonAnnotationIntrospector setConstructorPropertiesImpliesCreator(boolean b) { _cfgConstructorPropertiesImpliesCreator = b; return this; }

Observe también JacksonAnnotationIntrospector.setConstructorPropertiesImpliesCreator :

<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin>

Entonces, dos opciones, ya sea establecer MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES en false o crear un JacksonAnnotationIntrospector set setConstructorPropertiesImpliesCreator en false y establecer este AnnotationIntrospector en ObjectMapper través de ObjectMapper.setAnnotationIntrospector .

Note un par de cosas, estoy usando Jackson 2.8.10 y en esa versión MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES no existe. No estoy seguro de en qué versión de Jackson se agregó. Entonces, si no está allí, use el mecanismo JacksonAnnotationIntrospector.setConstructorPropertiesImpliesCreator .

Estoy experimentando en la combinación de Jackson y Lombok. Esas son mis clases:

package testelombok; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Value; import lombok.experimental.Wither; @Value @Wither @AllArgsConstructor(onConstructor=@__(@JsonCreator)) public class TestFoo { @JsonProperty("xoom") private String x; private int z; }

package testelombok; import com.fasterxml.jackson.databind.ObjectMapper; import com.xebia.jacksonlombok.JacksonLombokAnnotationIntrospector; import java.io.IOException; public class TestLombok { public static void main(String[] args) throws IOException { TestFoo tf = new TestFoo("a", 5); System.out.println(tf.withX("b")); ObjectMapper om = new ObjectMapper().setAnnotationIntrospector(new JacksonLombokAnnotationIntrospector()); System.out.println(om.writeValueAsString(tf)); TestFoo tf2 = om.readValue(om.writeValueAsString(tf), TestFoo.class); System.out.println(tf2); } }

Esos son los JARs que estoy agregando a la clase:

Lo estoy compilando con Netbeans (no creo que esto sea realmente relevante, pero lo informo de todos modos para que sea perfectamente reproducible). Los cinco JAR anteriores se guardan en una carpeta llamada " lib " dentro de la carpeta del proyecto (junto con " src ", " nbproject ", " test " y " build "). Los agregué a Netbeans a través del botón " Agregar JAR / Carpeta " en las propiedades del proyecto y se enumeran en el orden exacto en la lista anterior. El proyecto es un proyecto de tipo "aplicación Java" estándar.

Además, el proyecto Netbeans está configurado para " NO compilar en guardar ", " generar información de depuración ", " reportar API obsoletas ", " rastrear dependencias de Java ", " proceso de anotación activacte " y " proceso de anotación activacte en el editor ". El procesador de anotaciones o la opción de procesamiento de anotaciones no están configurados explícitamente en Netbeans. Además, la opción de línea de comando " -Xlint:all " se pasa en la línea de comando del compilador, y el compilador se ejecuta en una máquina virtual externa.

La versión de mi javac es 1.8.0_72 y la versión de mi java es 1.8.0_72-b15. My Netbeans es 8.1.

Mi proyecto compila bien. Sin embargo, arroja una excepción en su ejecución. La excepción no parece ser nada que parezca fácil o obvio, solucionable. Aquí está la salida, incluyendo el seguimiento de pila:

TestFoo(x=b, z=5) {"z":5,"xoom":"a"} Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator at [Source: {"z":5,"xoom":"a"}; line: 1, column: 1] at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:296) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:269) 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:475) at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3890) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3785) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833) at testelombok.TestLombok.main(TestLombok.java:14) Caused by: java.lang.IllegalArgumentException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addDeserializerConstructors(BasicDeserializerFactory.java:511) at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:323) at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:253) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:219) at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:141) at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:406) at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352) at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) ... 7 more

Ya he intentado pinchar aleatoriamente con las anotaciones @Value y @AllArgsConstructor , pero no pude mejorarlo.

Busqué en Google la excepción y encontré un informe de error antiguo en Jackson , y otro que está abierto, pero parece estar relacionado con otra cosa . Sin embargo, esto todavía no dice nada sobre qué es este error o cómo solucionarlo. Además, no pude encontrar nada útil buscando eso en otro lugar.

Como lo que estoy tratando de hacer es un uso muy básico tanto de lombok como de jackson, parece extraño que no pueda encontrar más información útil sobre cómo solucionar este problema. Tal vez me perdí algo?

Aparte de decir simplemente " no usar lombok " o " no usar jackson ", ¿alguien tiene alguna idea sobre cómo resolver esto?


He anotado todas mis clases así:

@JsonAutoDetect(fieldVisibility = Visibility.ANY) @JsonInclude(JsonInclude.Include.NON_DEFAULT) @Data @Accessors(fluent = true) @NoArgsConstructor @AllArgsConstructor public class Person { String id; String first; String last; }

Funcionó con todas las versiones de Lombok y Jackson durante, al menos, un par de años.

Ejemplo:

@JsonInclude(JsonInclude.Include.NON_NULL) @Data public class Person { String id; String first; String last; }

Y eso es. Lombok y Jackson juegan juntos como un amuleto.


Necesitas tener este módulo también. https://github.com/FasterXML/jackson-modules-java8

a continuación, active el parámetro -parameters para su compilador.

@JsonAutoDetect(fieldVisibility = Visibility.ANY) @JsonInclude(JsonInclude.Include.NON_DEFAULT) @Data @Accessors(fluent = true) @NoArgsConstructor @AllArgsConstructor


Para mí, funcionó cuando actualicé la versión lombok a: ''org.projectlombok: lombok: 1.18.0''


Puede hacer que Jackson juegue con casi cualquier cosa si usa su patrón "mixin" . Básicamente, le proporciona una forma de agregar anotaciones de Jackson a una clase existente sin modificar esa clase. Me inclino por recomendarlo aquí en lugar de una solución Lombok porque esto resuelve un problema que Jackson tiene con una característica de Jackson, por lo que es más probable que funcione a largo plazo.


Si quieres inmutable pero un json serializable POJO usando lombok y jackson. Use la nueva anotación de jacksons en su constructor @JsonPOJOBuilder(withPrefix = "") esta solución y funciona muy bien. Uso de la muestra

import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import lombok.Builder; import lombok.Value; @JsonDeserialize(builder = Detail.DetailBuilder.class) @Value @Builder public class Detail { private String url; private String userName; private String password; private String scope; @JsonPOJOBuilder(withPrefix = "") public static class DetailBuilder { } }

Si tiene demasiadas clases con @Builder y no desea que la anotación de código del @Builder esté vacía, puede anular el interceptor de anotaciones para que withPrefix vacío withPrefix

mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() { @Override public JsonPOJOBuilder.Value findPOJOBuilderConfig(AnnotatedClass ac) { if (ac.hasAnnotation(JsonPOJOBuilder.class)) {//If no annotation present use default as empty prefix return super.findPOJOBuilderConfig(ac); } return new JsonPOJOBuilder.Value("build", ""); } });

Y puede eliminar la clase de constructor vacía con la anotación @JsonPOJOBuilder .


Tuve exactamente el mismo problema, lo "resolví" agregando el parámetro suppressConstructorProperties = true (usando tu ejemplo):

@Value @Wither @AllArgsConstructor(suppressConstructorProperties = true) public class TestFoo { @JsonProperty("xoom") private String x; private int z; }

Jackson aparentemente no le gusta la anotación java.beans.ConstructorProperties agregada a los constructores. El parámetro suppressConstructorProperties = true le dice a Lombok no lo agregue (lo hace de manera predeterminada).


@AllArgsConstructor(suppressConstructorProperties = true) está en desuso. Definir lombok.anyConstructor.suppressConstructorProperties=true ( https://projectlombok.org/features/configuration ) y cambiar la anotación de lombok de POJO de @Value a @Data + @NoArgsConstructor + @AllArgsConstructor funciona para mí.


om.registerModule(new ParameterNamesModule()); om.setVisibility(FIELD, JsonAutoDetect.Visibility.ANY); om.setVisibility(CREATOR, JsonAutoDetect.Visibility.ANY);

Adicional a la clase de datos, debe estar correctamente configurado el ObjectMapper. En este caso, funciona bien con una configuración de ParameterNamesModule y configura la visibilidad de los campos y métodos de creación.

if (_cfgConstructorPropertiesImpliesCreator && config.isEnabled(MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES)

Entonces debería funcionar como se esperaba.