我将给你一个示例,说明我如何为控制器读取 REST 标头。我的控制器只接受 application/json 作为请求类型,如果我有需要读取的数据。我怀疑你的问题是你有一个应用程序/八位字节流,Spring不知道如何处理。
通常,我的控制器如下所示:
@Controller
public class FooController {
@Autowired
private DataService dataService;
@RequestMapping(value="/foo/", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Data> getData(@RequestHeader String dataId){
return ResponseEntity.newInstance(dataService.getData(dataId);
}
现在有很多代码在后台做一些事情,所以我会为你分解它。
响应实体是每个控制器返回的自定义对象。它包含一个允许创建新实例的静态工厂。我的数据服务是一个标准服务类。
魔术发生在幕后,因为你正在使用JSON,你需要告诉Spring使用Jackson来映射HttpRequest对象,以便它知道你正在处理什么。
您可以通过在配置块中指定此项来执行此操作<mvc:annotation-driven>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
ObjectMapper只是Jackson用来将JSON的请求实际映射到对象的扩展。com.fasterxml.jackson.databind.ObjectMapper
我怀疑你得到了你的例外,因为你还没有指定一个映射器,可以将八位字节流读入一个对象,或者Spring可以处理的东西。如果您尝试进行文件上传,那完全是另一回事。
因此,发送到我的控制器的请求看起来就像这样,只是有一个名为.dataId
如果要将其更改为请求参数,并用于从请求中读取 ID,则您的请求将如下所示:@RequestParam String dataId
contactId : {"fooId"}
此请求参数可以根据需要尽可能复杂。您可以将整个对象序列化为JSON,将其作为请求参数发送,Spring会将其序列化(使用Jackson)回准备使用的Java对象。
控制器中的示例:
@RequestMapping(value = "/penguin Details/", method = RequestMethod.GET)
@ResponseBody
public DataProcessingResponseDTO<Pengin> getPenguinDetailsFromList(
@RequestParam DataProcessingRequestDTO jsonPenguinRequestDTO)
请求已发送:
jsonPengiunRequestDTO: {
"draw": 1,
"columns": [
{
"data": {
"_": "toAddress",
"header": "toAddress"
},
"name": "toAddress",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "fromAddress",
"header": "fromAddress"
},
"name": "fromAddress",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "customerCampaignId",
"header": "customerCampaignId"
},
"name": "customerCampaignId",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "penguinId",
"header": "penguinId"
},
"name": "penguinId",
"searchable": false,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "validpenguin",
"header": "validpenguin"
},
"name": "validpenguin",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "",
"header": ""
},
"name": "",
"searchable": false,
"orderable": false,
"search": {
"value": "",
"regex": false
}
}
],
"order": [
{
"column": 0,
"dir": "asc"
}
],
"start": 0,
"length": 10,
"search": {
"value": "",
"regex": false
},
"objectId": "30"
}
它会自动序列化回DataProcessingRequestDTO对象,然后提供给控制器准备供我使用。
如您所见,此功能非常强大,允许您将数据从 JSON 序列化为对象,而无需编写任何代码。您可以为 和 执行此操作,从而分别在参数或请求正文中访问 JSON。@RequestParam
@RequestBody
现在您已经有了一个具体的示例,一旦您将请求类型更改为 .,您就不应该有任何问题了。application/json