结论
可以通过使用以下映射和配置来解决问题:
@BasePathAwareController
@RequestMapping("/businessActions")
public class MyCustomRestEndpoint {
@GetMapping(value = "/modellGenerieren", produces = MediaType.TEXT_PLAIN_VALUE)
public @ResponseBody ResponseEntity<String> modellGenerieren(@Param(value="project") String project) throws IOException {
return ResponseEntity.ok("A String!");
}
}
@Configuration
public class PlainTextConfiguration implements RepositoryRestConfigurer {
@Override
public void configureHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters)
{
StringHttpMessageConverter converter = new StringHttpMessageConverter();
converter.setSupportedMediaTypes(configureMediaTypes());
messageConverters.add(converter);
}
private List<MediaType> configureMediaTypes() {
List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.TEXT_PLAIN);
mediaTypes.add(MediaType.parseMediaType("text/plain;charset=iso-8859-1"));
mediaTypes.add(MediaType.parseMediaType("text/plain;charset=UTF-8"));
mediaTypes.add(MediaType.parseMediaType("text/plain;charset=UTF-16"));
return mediaTypes;
}
}
在发出请求时,通过指定 ACCEPT
标头(这是关键!):
GET http://localhost:8080/api/businessActions/modellGenerieren
Content-Type: text/plain
Accept: text/plain
这将产生以下响应:
GET http://localhost:8080/api/businessActions/modellGenerieren
HTTP/1.1 200 OK
Date: Mon, 24 Dec 2018 06:21:10 GMT
Content-Type: text/plain
Accept-Charset: ... <large charset>
Content-Length: 9
A String!
Response code: 200 (OK)
原因
经过调查,似乎你无法返回未带引号的字符串的原因是由于BasePathAwareHandlerMapping#lookupHandlerMethod
函数的行为。
lookupHandlerMethod
基本上假定当对方法进行请求时,在HTTP请求的ACCEPT
头中制定了可接受的媒体类型。否则,它会使用默认媒体类型(可使用RepositoryRestConfigurer#configureRepositoryRestConfiguration
进行配置)。
Spring Data REST的默认媒体类型的默认值为application/json
或application/hal+json
(取决于该默认值,请参阅此处)。这就是为什么在结果中只看到用双引号""
括起来的Strings
和application/json
内容类型的原因。字符串正在使用Jackson
转换器进行转换(它会用引号括起Strings
),而不是使用String
转换器。
经过调查,我同意你的看法,这似乎是一个奇怪的假设。也就是说,框架不能假定所有请求都始终明确指定了所需媒体类型的ACCEPT
头(至少我个人并不总是希望看到它),否则会因为像你这样的用例而默认假定所有请求都应该是默认媒体类型。
没有深入研究文档,事实上,@BasePathAwareController
似乎暗示除了标准的Spring Data Rest实体之外,还有其他可供使用的内容可以利用Spring Data REST。
即使未指定ACCEPT
头,我个人仍会将produces类型返回给客户端。如果我要编写一些修改BasePathAwareHandlerMapping
的代码,我会添加以下关于我的注释行的内容:
@Override
protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) throws Exception {
...
if (!defaultFound) {
mediaTypes.add(configuration.getDefaultMediaType());
}
super.lookupHandlerMethod(lookupPath, new CustomAcceptHeaderHttpServletRequest(request, mediaTypes));
}