7

full error

Invalid type definition for type `com.xenoterracide.brix.configloader.spi.RawFileConfiguration`: Argument #0 has no property name, is not Injectable: can not use as Creator [constructor for com.xenoterracide.brix.configloader.spi.RawFileConfiguration, annotations: {interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}]
 at [Source: (File); line: 1, column: 1]
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Invalid type definition for type `com.xenoterracide.brix.configloader.spi.RawFileConfiguration`: Argument #0 has no property name, is not Injectable: can not use as Creator [constructor for com.xenoterracide.brix.configloader.spi.RawFileConfiguration, annotations: {interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}]
 at [Source: (File); line: 1, column: 1]

if I'm reading it write, javap is telling me that the class does have named parameters

  com.xenoterracide.brix.configloader.spi.RawFileConfiguration(java.util.Map<java.lang.String, java.lang.String>, java.lang.Boolean, java.lang.String, java.lang.String);
    descriptor: (Ljava/util/Map;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/String;)V
    flags: (0x0000)
    Code:
      stack=3, locals=5, args_size=5
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: aload_1
         6: invokestatic  #2                  // InterfaceMethod java/util/Map.of:()Ljava/util/Map;
         9: invokestatic  #3                  // Method java/util/Objects.requireNonNullElse:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
        12: checkcast     #4                  // class java/util/Map
        15: putfield      #5                  // Field context:Ljava/util/Map;
        18: aload_0
        19: aload_2
        20: putfield      #6                  // Field overwrite:Ljava/lang/Boolean;
        23: aload_0
        24: aload_3
        25: putfield      #7                  // Field source:Ljava/lang/String;
        28: aload_0
        29: aload         4
        31: putfield      #8                  // Field destination:Ljava/lang/String;
        34: return
      LineNumberTable:
        line 33: 0
        line 34: 4
        line 35: 18
        line 36: 23
        line 37: 28
        line 38: 34
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      35     0  this   Lcom/xenoterracide/brix/configloader/spi/RawFileConfiguration;
            0      35     1 context   Ljava/util/Map;
            0      35     2 overwrite   Ljava/lang/Boolean;
            0      35     3 source   Ljava/lang/String;
            0      35     4 destination   Ljava/lang/String;
      LocalVariableTypeTable:
        Start  Length  Slot  Name   Signature
            0      35     1 context   Ljava/util/Map<Ljava/lang/String;Ljava/lang/String;>;
    MethodParameters:
      Name                           Flags
      context
      overwrite
      source
      destination
    Signature: #34                          // (Ljava/util/Map<Ljava/lang/String;Ljava/lang/String;>;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/String;)V
    RuntimeVisibleAnnotations:
      0: #36()
        com.fasterxml.jackson.annotation.JsonCreator
    RuntimeVisibleTypeAnnotations:
      0: #21(): METHOD_FORMAL_PARAMETER, param_index=1
        org.checkerframework.checker.nullness.qual.Nullable
      1: #21(): METHOD_FORMAL_PARAMETER, param_index=2
        org.checkerframework.checker.nullness.qual.Nullable

this is my gradle configuration

tasks.withType<JavaCompile>().configureEach {
  options.compilerArgs.addAll(
    listOf(
      "-parameters",
      "-Xlint:deprecation",
      "-Xlint:unchecked"
    )
  )

and the --debug output

2021-05-12T21:02:29.834-0500 [INFO] [org.gradle.jvm.toolchain.internal.DefaultToolchainJavaCompiler] Compiling with toolchain '/home/xeno/.local/share/sdkman/candidates/java/11.0.10.hs-adpt'.
2021-05-12T21:02:29.834-0500 [DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments: --release 11 -d /home/xeno/IdeaProjects/brix/config-loader/yaml/build/classes/java/test -h /home/xeno/IdeaProjects/brix/config-loader/yaml/build/generated/sources/headers/java/test -g -sourcepath  -proc:none -s /home/xeno/IdeaProjects/brix/config-loader/yaml/build/generated/sources/annotationProcessor/java/test -XDuseUnsharedTable=true -classpath /home/xeno/IdeaProjects/brix/config-loader/yaml/build/classes/java/testFixtures:/home/xeno/IdeaProjects/brix/config-loader/yaml/build/classes/java/main:/home/xeno/IdeaProjects/brix/config-loader/api/build/classes/java/main:/home/xeno/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.13.3/ec1508160b93d274b1add34419b897bae84c6ca9/log4j-api-2.13.3.jar:/home/xeno/IdeaProjects/brix/config-loader/spi/build/classes/java/main:/home/xeno/IdeaProjects/brix/cli/api/build/classes/java/main:/home/xeno/IdeaProjects/brix/cli/api/build/classes/java/testFixtures:/home/xeno/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.11/68e9a6adf7cf8eb7e9d31bbc554c7c75eeaac568/commons-lang3-3.11.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.8.0/92999e26e6534606b5678014e66948286298a35c/commons-io-2.8.0.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.apache.tika/tika-core/1.26/9715ed7afac774b2de2e6689d16d1639c29eaf5a/tika-core-1.26.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/io.vavr/vavr/0.10.3/d2feb2bba9bfbfd043c4a25b0a14d568d18a61e3/vavr-0.10.3.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/2.11.4/ba01014ab0228449be401975b1a7af2f3cdaf1d7/jackson-dataformat-yaml-2.11.4.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.11.4/5d9f3d441f99d721b957e3497f0a6465c764fad4/jackson-databind-2.11.4.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.11.4/593f7b18bab07a76767f181e2a2336135ce82cc4/jackson-core-2.11.4.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test-autoconfigure/2.4.5/b90b78690bed25eb742f20c8584ce67e21b3a3f5/spring-boot-test-autoconfigure-2.4.5.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test/2.4.5/5bf8d6e7dfd30e43c04c7b1980cead057cdf7267/spring-boot-test-2.4.5.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-autoconfigure/2.4.5/32887531b5a125d4840a08f9610aec766de73606/spring-boot-autoconfigure-2.4.5.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/2.4.5/d9b82470df2e9549e448d7cef39e578d91f9867f/spring-boot-2.4.5.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.3.6/d99d3931528309a4ff49b7d18f76f1657aa16c52/spring-context-5.3.6.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/3.13.0/e29afc6adb63a39286d38dc0e00d164117c02f0d/checker-qual-3.13.0.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.7.1/a7261dff44e64aea7f621842eac5977fd6d2412d/junit-jupiter-api-5.7.1.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/1.7.1/7c49f0074842d07f4335de2389d624a7437d1407/junit-platform-commons-1.7.1.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-params/5.7.1/6f81b3c053433a8a40a378d2b4f056c5c31e50ff/junit-jupiter-params-5.7.1.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.assertj/assertj-core/3.18.1/aaa02680dd92a568a4278bb40aa4a6305f632ec0/assertj-core-3.18.1.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/5.3.6/510d9afcfce1fa9a2086906ab87b9989973c251c/spring-aop-5.3.6.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/5.3.6/99cc944fb3454410b47fc98d4b148a6205bfe8f6/spring-beans-5.3.6.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/5.3.6/33ba1d8dfaab0fd60ce4213a206f5d4fc77ce27a/spring-expression-5.3.6.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/5.3.6/8f91f60f628075701fde72bb5a43a33feeb27e93/spring-core-5.3.6.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.11.4/2c3f5c079330f3a01726686a078979420f547ae4/jackson-annotations-2.11.4.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jcl/5.3.6/53ddfc5cfdf438a1d3346fc2912c3e3049a8cb76/spring-jcl-5.3.6.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.apiguardian/apiguardian-api/1.1.0/fc9dff4bb36d627bdc553de77e1f17efd790876c/apiguardian-api-1.1.0.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.opentest4j/opentest4j/1.2.0/28c11eb91f9b6d8e200631d46e20a7f407f2a046/opentest4j-1.2.0.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/io.vavr/vavr-match/0.10.3/e0c0e10adee0204f71aa6d83a7c2547a5c8c9573/vavr-match-0.10.3.jar:/home/xeno/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/1.27/359d62567480b07a679dc643f82fc926b100eed5/snakeyaml-1.27.jar -parameters -Xlint:deprecation -Xlint:unchecked /home/xeno/IdeaProjects/brix/config-loader/yaml/src/test/java/com/xenoterracide/brix/configloader/yaml/RawFileConfigurationTest.java /home/xeno/IdeaProjects/brix/config-loader/yaml/src/test/java/com/xenoterracide/brix/configloader/yaml/YamlConfigLoaderTest.java
2021-05-12T21:02:29.834-0500 [INFO] [org.gradle.api.internal.tasks.compile.JdkJavaCompiler] Compiling with JDK Java compiler API.

This is how ObjectMapper is configured

@Configuration()
class YamlConfig {

  @Bean
  MimeType yaml( MimeTypes mimeTypes ) throws MimeTypeException {
    return mimeTypes.forName( "text/x-yaml" );
  }

  @Bean
  ObjectMapper yamlMapper() {
    return new ObjectMapper( new YAMLFactory() )
      .enable( DeserializationFeature.FAIL_ON_UNRESOLVED_OBJECT_IDS )
      .enable( DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES )
      .enable( DeserializationFeature.WRAP_EXCEPTIONS )
      .enable( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES );
  }
}

https://scans.gradle.com/s/injralardtfgu

how do I fix it so that Jackson constructor injection works?

xenoterracide
  • 16,274
  • 24
  • 118
  • 243

1 Answers1

8

I needed to register the ParameterNamesModule

/*
* Copyright © 2021 Caleb Cushing.
* Apache 2.0. See https://github.com/xenoterracide/brix/LICENSE
* https://choosealicense.com/licenses/apache-2.0/#
*/
package com.xenoterracide.brix.configloader.yaml;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import org.apache.tika.mime.MimeType;
import org.apache.tika.mime.MimeTypeException;
import org.apache.tika.mime.MimeTypes;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration()
class YamlConfig {

  @Bean
  MimeType yaml( MimeTypes mimeTypes ) throws MimeTypeException {
    return mimeTypes.forName( "text/x-yaml" );
  }

  @Bean
  ObjectMapper yamlMapper() {
    return new ObjectMapper( new YAMLFactory() )
      .registerModule( new ParameterNamesModule() )
      .enable( DeserializationFeature.FAIL_ON_UNRESOLVED_OBJECT_IDS )
      .enable( DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES )
      .enable( DeserializationFeature.WRAP_EXCEPTIONS )
      .enable( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES );
  }
}
xenoterracide
  • 16,274
  • 24
  • 118
  • 243