【问题标题】:Spring-Boot content-negotation does not workSpring-Boot 内容协商不起作用
【发布时间】:2017-11-03 14:17:21
【问题描述】:

我希望有人可以帮助我。

我的问题:我想用支持 REST 的 spring-boot 创建一个 web 后端。对于 POST-Request,它必须接受 JSON 和 XML。

我已经用 Jackson 实现了一个 messageConverter。 打包 backend.config;

    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.HttpMessageConverter;
    import                 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
    import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
    import org.springframework.oxm.xstream.XStreamMarshaller;
    import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

    import java.util.List;

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    /* i have commented this out, bc it does not work for me
        @Override
        public void configureContentNegotiation(
        ContentNegotiationConfigurer configurer) {
            // Simple strategy: only path extension is taken into account
            configurer.
            defaultContentType(MediaType.APPLICATION_XML).
            mediaType("html", MediaType.TEXT_HTML).
            mediaType("xml", MediaType.APPLICATION_XML).
            mediaType("json", MediaType.APPLICATION_JSON);
}
*/

@Override
public void configureMessageConverters(
        List<HttpMessageConverter<?>> messageConverters) {

    messageConverters.add(createXmlHttpMessageConverter());
    messageConverters.add(new MappingJackson2HttpMessageConverter());

    super.configureMessageConverters(messageConverters);
}
private HttpMessageConverter<Object> createXmlHttpMessageConverter() {
    MarshallingHttpMessageConverter xmlConverter =
            new MarshallingHttpMessageConverter();

    XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();
    xmlConverter.setMarshaller(xstreamMarshaller);
    xmlConverter.setUnmarshaller(xstreamMarshaller);

    return xmlConverter;
}

这是我的控制器:

    package backend.controller;


    import backend.entity.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    import backend.service.UserService;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;

    import java.awt.*;
    import java.util.List;

    @RestController
    @EnableWebMvc
    public class UserController {

@Autowired
private UserService userService;

@GetMapping(value="/users")
public List<User> getUser(){
    return userService.getAll();
}

@PostMapping(value="/users", consumes = MediaType.APPLICATION_XML_VALUE)
public void addUser(@RequestBody User user){
    userService.addUser(user);

}

如果我发出 getRequest,一切正常。 但是如果我尝试发布请求,我会得到这个异常:

<linked-hash-map>
    <entry>
        <string>timestamp</string>
        <date>2017-11-03 14:00:14.4 UTC</date>
    </entry>
    <entry>
        <string>status</string>
        <int>400</int>
    </entry>
    <entry>
        <string>error</string>
        <string>Bad Request</string>
    </entry>
    <entry>
        <string>exception</string>
        <string>org.springframework.beans.TypeMismatchException</string>
    </entry>
    <entry>
        <string>message</string>
        <string>Failed to convert value of type &apos;backend.entity.User&apos;             to required type &apos;backend.entity.User&apos;</string>
    </entry>
    <entry>
        <string>path</string>
        <string>/users</string>
    </entry>
</linked-hash-map>

我的发帖请求如下所示:

<backend.entity.User>
    <username>testUserName</username>
    <firstName>testFirstName</firstName>
    <lastName>testLastName</lastName>
</backend.entity.User>

我的实体类有以下形式:

package backend.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.annotation.Id;

@Data
@AllArgsConstructor
public class User {

@Id
private String username;
private String firstName;
private String lastName;


}

我的依赖:

    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-activemq</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
    </dependency>
    <dependency>
        <groupId>cz.jirutka.spring</groupId>
        <artifactId>embedmongo-spring</artifactId>
        <version>1.3.1</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.7.4</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.4</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.7.4</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
        <version>1.4.9</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-oxm</artifactId>
        <version>3.0.6.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-releases</id>
        <name>Spring Releases</name>
        <url>https://repo.spring.io/libs-release</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-releases</id>
        <name>Spring Releases</name>
        <url>https://repo.spring.io/libs-release</url>
    </pluginRepository>
</pluginRepositories>

有人知道我的问题的原因吗?

谢谢大家

【问题讨论】:

  • 如果你使用的是SpringBoot,那么你需要在pom.xml中放入正确的依赖来激活转换器,你不需要在WebConfig中显式配置转换器,对于XML,你需要添加依赖&lt;dependency&gt; &lt;groupId&gt;com.fasterxml.jackson.dataformat&lt;/groupId&gt; &lt;artifactId&gt;jackson-dataformat-xml&lt;/artifactId&gt; &lt;/dependency&gt;
  • 我在 SpringBoot 中试过,依赖正确,没有 WebConfig,也没有显式设置转换器,它工作正常
  • 你好@AmitKBist,谢谢你的回答!我已经更新了我的帖子,您现在可以看到我的依赖项。如果您像上面一样发出帖子请求,它会起作用吗?谢谢和问候
  • 是的,它对我有用,但我的项目中没有 WebConfig 类。因为您不需要带有 SpringBoot 项目的 WebConfig。此外,如果您已将 spring-boot-starter-parent 声明为 节点,则 jackson-* 相关依赖项
  • 你能给我看看你的 pom 文件吗,我不明白 :(

标签: java json spring spring-mvc jackson


【解决方案1】:

我的 Pom 是

<?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>com.example</groupId>
    <artifactId>stackoverflow</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>stackoverflow</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.M3</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>javax.transaction-api</artifactId>
            <version>1.2</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>


</project>

除了jackson-dataformat-xml,我没有放任何与Jackson相关的依赖

【讨论】:

  • 感谢您的回答。但这对我不起作用。 :( 我正在使用带有嵌入式 mongodb 服务器的 mongodb 数据库。如果我尝试在 xml 中设置发布请求,你的意思是这可能是我收到错误的原因吗?谢谢 :)
  • 你可以看到我的项目:github.com/Nossair93/Stackoverflow 谢谢 :)
  • @JuanCarlosRodriguez 使用 mongodb 没关系,从我的 pom.xml 中你需要检查除了 jackson-xml 我没有添加任何重复的依赖项。
  • 我已经删除了所有jackson依赖项,除了: com.fasterxml.jackson.dataformatjackson-dataformat-xml 但是我得到了和上面一样的错误:(
  • 谢谢,它适用于您的依赖。我不知道为什么它昨天没有工作
猜你喜欢
  • 2019-03-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多