2016-10-10 6 views
3

Я создаю основную пружину на основе веб-приложения:Spring веб-приложение возвращает HTTP Status 406

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; 
    } 

Вот моя весна конфигурации класс:

@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"); 
    } 
} 

При тестировании контроллера (с помощью браузера) Я получаю: enter image description here

Если я возвращаю простую строку она работает отлично.

Я пытаюсь отлаживать метод configureMessageConverters и configureContentNegotiation, но по какой-то причине он никогда не попадает туда (при загрузке), но я не уверен, что это связано с проблемой.

Любые идеи?

ответ

1

HTTP 406 - это указание на то, что ваш контент запроса не согласован, вероятно, необходимые HTTP-конвертеры не найдены в конфигурации. Простой способ добавить базовый набор конвертеров сообщений будет аннотировать ваш контроллер @EnableMvc

+0

Я следую этому примеру: https://github.com/bkielczewski/example-spring-mvc-initializer – forhas

+0

@forhas Как вы можете видеть, он @ EnableWebMvc аннотировал свою конфигурацию https://github.com/bkielczewski/example- spring-mvc-initializer/blob/master/src/main/java/eu/kielczewski/example/config/WebMvcConfig.java – kuhajeyan

+1

Да, как вы уже упоминали, я принял ваш ответ, спасибо большое! – forhas

0

У меня была такая же проблема и не могли найти решение здесь или в другом месте.

Я также пробовал советовать применять @EnableMvc на моем AppConfig, но это вызвало другую проблему, в которой Tomcat даже не успел начать работу.

В конце концов, мне пришлось переписать свой класс AppInit следующим образом: https://github.com/viralpatel/spring4-restful-example/tree/master/src/main/java/net/viralpatel/spring/config

Теперь я получаю JSON назад, когда я вернусь в POJO. Мне не нравится это исправление. Код выглядит неполным по сравнению с AppInit, показанным здесь в проблеме, но я отклеиваюсь.