2015-10-29 6 views
3

Я хочу, чтобы вернуть простую простую текстовую строку следующим образом:Как вернуть обычный текст в контроллер весны?

@RestController 
@RequestMapping("/test") 
public class TestController { 
    @ResponseStatus(HttpStatus.OK) 
    @RequestMapping(value = "/my", method = RequestMethod.GET, produces="text/plain") 
    public String test() { 
     return "OK"; 
    } 

Проблема: У меня также есть глобальный ContentNegotiation фильтр следующим образом:

@Configuration 
public class ContentNegotiationAdapter extends WebMvcConfigurerAdapter { 
    @Override 
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { 
     configurer.favorPathExtension(false) 
       .favorParameter(true) 
       .ignoreAcceptHeader(true) 
       .useJaf(false) 
       .defaultContentType(MediaType.APPLICATION_XML); 
    } 

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

Результат: всякий раз, когда я доступ к контроллеру пружины, я «получаю ошибку:

Could not find acceptable representation

Вопрос: как я могу заставить контроллер к г eturn plain text, хотя только XML был настроен в контексте согласования контента (что мне нужно сохранить)?

ответ

0

Если я хорошо помню, вы можете аннотировать метод с помощью @ResponseBody, и он вернет обычный текст.

Check this

0

Вы должны указать @ResponseBody аннотации для метода испытаний, как:

public @ResponseBody String test(){} 
+2

Нет, '@ RestController' подразумевает '@ ResponseBody'. – membersound

+0

Как упоминалось в @membersound, использование '@ RestController' эквивалентно записи' @ ResponseBody' во всех методах сопоставления запросов в вашем контроллере. – bphilipnyc

2

Если удалить produces="text/plain" из отображения, он возвращает обычный текст, но заголовок установлен в "application/xml". Это, вероятно, нежелательно. Я тестировал последнюю версию Spring Boot.

Если вы используете версию Spring> = 4.1.2, вы можете попробовать использовать defaultContentTypeStrategy вместо defaultContentType, чтобы установить правильный тип содержимого в заголовке:

configurer.favorPathExtension(false) 
      .favorParameter(true) 
      .ignoreAcceptHeader(true) 
      .useJaf(false) 
      .defaultContentTypeStrategy(new ContentNegotiationStrategy() { 
       @Override 
       public List<MediaType> resolveMediaTypes(NativeWebRequest nativeWebRequest) throws 
         HttpMediaTypeNotAcceptableException { 
        System.out.println("Description:"+nativeWebRequest.getDescription(false)); 
        if (nativeWebRequest.getDescription(false).endsWith("/test/my")) { 
         return Collections.singletonList(MediaType.TEXT_PLAIN); 
        } 
        else { 
         return Collections.singletonList(MediaType.APPLICATION_XML); 
        } 
       } 
      }) 
      //.defaultContentType(MediaType.APPLICATION_XML) 
;