Spring-Boot内容协商不起作用

时间:2017-11-03 14:17:21

标签: java json spring spring-mvc jackson

我希望有人可以帮助我。

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

我已经与杰克逊实施了一个messageConverter。                                            package 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>

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

谢谢你们

1 个答案:

答案 0 :(得分:0)

我的Pom是

EXAMPLE.LABEL

除了jackson-dataformat-xml

之外,我还没有任何与杰克逊相关的依赖关系