JSON ответ и POJO имеют имена столбцов с разным регистром - PullRequest
0 голосов
/ 07 мая 2020

Поля имеют несовпадение в своем регистре. Я чувствую, что чего-то не хватает, когда поля POJO преобразуются в ответ JSON. Сериализация Джексона неправильно устанавливает свойства

My JSON response looks like this 
[{"drivers":0,"next_DT":"May 18 2019  2:00AM"}]    

Expected 
[{"DRIVERS":0,"NEXT_DT":"May 18 2019 2:00AM"}]    

Ниже мой POJOClass, где я отображаю результаты собственного запроса

public class GetTrucksDueResultModel 
{

     private int DRIVERS;

     private String NEXT_DT;

public GetTrucksDueResultModel()
{

}

public GetTrucksDueResultModel(String NEXT_DT,int DRIVERS)
{
    this.NEXT_DT = NEXT_DT;
    this.DRIVERS = DRIVERS;
}
public int getDrivers() {
    return DRIVERS;
}

public void setDrivers(int dRIVERS) {
    DRIVERS = dRIVERS;
}

public String getNEXT_DT() {
    return NEXT_DT;
}

public void setNEXT_DT(String nEXT_DT) {
    NEXT_DT = nEXT_DT;
}

}   

И мой sqlMapping в классе сущности выглядит вот так

@SqlResultSetMapping(name="GetTrucksDueResultMapping",
                   classes={
                   @ConstructorResult(targetClass=GetTrucksDueResultModel.class,
                  columns={
                           @ColumnResult(name="NEXT_DT", type=String.class),
                           @ColumnResult(name="DRIVERS", type=int.class)
                        })
})

Ниже приведены зависимости в моем pom xml.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <!--<dependency> <groupId>jconn4</groupId> <artifactId>jconn4</artifactId> 
        <version>1.0</version> </dependency> -->
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-sql</artifactId>
        <version>${querydsl.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
</dependencies>    

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Добавление аннотаций @JsonGetter ("NEXT_DT") и @JsonGetter ("DRIVERS") поверх соответствующих геттеров сработало для меня. Но не лучшая идея, если у вас много полей.

0 голосов
/ 07 мая 2020

Джексон использует геттеры для сериализации состояния. Вот почему атрибуты JSON имеют нижний регистр.

Если вы хотите использовать атрибуты, вам необходимо настроить Джексона следующим образом:

@Configuration
public class JsonConfig {

    @Bean
    public Jackson2ObjectMapperBuilder objectMapperBuilder() {

        return new Jackson2ObjectMapperBuilder() {

            @Override
            public void configure(ObjectMapper objectMapper) {
                super.configure(objectMapper);
                objectMapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
                objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
            }
        };
    }
}

Это устанавливает PropertyAccessor в полях вместо геттеры и сеттеры.

...