Как вернуть сериализованный объект, используя MappingJackson2HttpMessageConverter - PullRequest
0 голосов
/ 19 января 2019

Я изучаю Spring Framework, и первая цель для меня - вернуть объект Version, используя встроенный сериализатор.

public class Version {
    private int build;
    private String releaseType;

    public Version(int build, String releaseType) {
        this.build          = build;
        this.releaseType    = releaseType;
    }

    public int getBuild() {
        return build;
    }

    public String getReleaseType() {
        return releaseType;
    }

    public void setBuild(int build) {
        this.build = build;
    }

    public void setReleaseType(String releaseType) {
        this.releaseType = releaseType;
    }
}

И мой корневой класс (я назвал его Kernel), хотел бы остатьсяс настройкой приложения с использованием одного класса

@EnableWebMvc
@Configuration
public class Kernel extends AbstractDispatcherServletInitializer implements WebMvcConfigurer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext();
        annotationConfigWebApplicationContext.register(VersionController.class);

        return annotationConfigWebApplicationContext;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/*" };
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter());
    }
}

Контроллер

@RestController
public class VersionController {
    @RequestMapping("/version")
    @ResponseBody
    public Version getVersion() {
        return new Version(192837, "DEV");
    }
}

Я пытаюсь пойти как можно проще, у меня нет никакого файла XML в моем проекте, так как яхочу перейти полностью Аннотация и Java режим, пока я могу.

Мне никогда не нравилась концепция, управляемая XML, в Spring Framework, так как большую часть времени содержимое этих файлов XML выглядит как открытый мусор для программиста, который никто, кроме владельца, не поймет, как настроить.Какой смысл выставлять конфигурацию для сериализаторов ответов, так как работник развертывания не имеет ни малейшего представления, что это такое.

Я получил ошибку:

HTTP Status 500 – Internal Server Error, No converter found for return value of type

Я подозреваючто Джексон не вызывается, потому что Spring не знает, что он должен использовать его на объекте Version, но я понятия не имею, как заставить Spring сделать это.

Мой pom.xml просто наверняка (используяTomcat9 в качестве веб-сервера)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>pl.protean.league-craft</groupId>
    <artifactId>league-craft</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.2</version>
                <configuration>
                    <warName>lc</warName>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>Kernel</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

1 Ответ

0 голосов
/ 25 января 2019

Я решил свою проблему благодаря этому ответу https://stackoverflow.com/a/10650452/2010246

A

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new MappingJackson2HttpMessageConverter());
}

Не будет работать так же, даже если я переопределю этот метод в AbstractDispatcherServletInitializer

Вместо этого мне пришлось создать отдельный класс для конфигурации MVC

package configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

@Configuration
public class Mvc extends WebMvcConfigurationSupport {
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(converter());
        addDefaultHttpMessageConverters(converters);
    }

    @Bean
    MappingJackson2HttpMessageConverter converter() {
        return new MappingJackson2HttpMessageConverter();
    }
}

Теперь он загружается правильно, и я могу просто вернуть класс, как я хотел

Я полагаю, что основная проблема заключалась в том, что не было класса, аннотируемого как @Configuration, который расширяет WebMvcConfigurationSupport родительский элемент

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...