【问题标题】:Spring web app returns HTTP Status 406Spring Web 应用程序返回 HTTP 状态 406
【发布时间】:2016-10-10 14:10:26
【问题描述】:

我正在创建一个基于 Spring 的基本网络应用:

pom 依赖:

<properties>
    <java-version>1.8</java-version>
    <springframework-version>4.3.3.RELEASE</springframework-version>
    <jackson-version>2.8.3</jackson-version>
    <org.slf4j-version>1.7.6</org.slf4j-version>
    <logback.version>1.1.7</logback.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>

    <!-- Jackson JSON Mapper -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson-version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson-version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson-version}</version>
    </dependency>

    <!-- Logging -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${org.slf4j-version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- @Inject -->
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
</dependencies>

为了跳过 web.xml 的使用,我使用了 WebApplicationInitializer:

public class AppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        WebApplicationContext context = getContext();
        servletContext.addListener(new ContextLoaderListener(context));
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/*");
    }

    private AnnotationConfigWebApplicationContext getContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation(SpringModule.class.getPackage().getName());
        return context;
    }

这是我的 spring 配置类:

@Configuration
@ComponentScan(basePackages = "com.company.app")
public class SpringModule extends WebMvcConfigurerAdapter {

    public SpringModule() {
        super();
    }

    private MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        jsonConverter.setObjectMapper(objectMapper);
        return jsonConverter;
    }


    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        messageConverters.add(customJackson2HttpMessageConverter());
        messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
        messageConverters.add(new StringHttpMessageConverter());
        messageConverters.add(new ByteArrayHttpMessageConverter());
        messageConverters.add(new ResourceHttpMessageConverter());
        messageConverters.add(new SourceHttpMessageConverter());
        messageConverters.add(new FormHttpMessageConverter());

        super.configureMessageConverters(messageConverters);
    }

    /*
 * Configure ContentNegotiationManager
 */
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.ignoreAcceptHeader(true).defaultContentType(
                MediaType.APPLICATION_JSON);
    }

这是我的测试控制器:

@Controller
@RequestMapping(value = "/user")
public class SomeController {

    @RequestMapping(value = "/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public Person helloElad() {
        return new Person("some name");
    }
}

在测试控制器(使用浏览器)时,我得到:

如果我返回一个普通的字符串,它工作正常。

我尝试调试方法 configureMessageConvertersconfigureContentNegotiation 但由于某种原因它永远不会到达那里(在引导时),但我不确定它是否与问题有关。

有什么想法吗?

【问题讨论】:

    标签: spring web-applications spring-web


    【解决方案1】:

    HTTP 406 表示您的请求内容未协商,可能是在配置中未找到必要的 http 消息转换器。添加基本​​消息转换器集的简单方法是注释您的控制器@EnableMvc

    【讨论】:

    【解决方案2】:

    我遇到了同样的问题,在这里或其他地方找不到解决方案。

    我还尝试了在我的 AppConfig 上应用 @EnableMvc 的建议,但这会导致 Tomcat 甚至无法成功启动的不同问题。

    最终,我不得不重写我的 AppInit 类,如下所示: https://github.com/viralpatel/spring4-restful-example/tree/master/src/main/java/net/viralpatel/spring/config

    现在,当我返回 POJO 时,我将返回 JSON。我不喜欢这个修复。与此处问题中显示的 AppInit 相比,该代码似乎不完整,但我没有被卡住。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 2019-04-30
      • 2014-12-12
      相关资源
      最近更新 更多