我将举一个例子,说明我是如何为我的控制器读取 REST 标头的。如果我有需要读取的数据,我的控制器只接受 application/json 作为请求类型。我怀疑您的问题是您有一个 Spring 不知道如何处理的 application/octet-stream。
通常我的控制器看起来像这样:
@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);
}
现在这里有很多代码在后台做一些事情,所以我会为你分解它。
ResponseEntity 是每个控制器返回的自定义对象。它包含一个允许创建新实例的静态工厂。我的数据服务是一个标准服务类。
魔术发生在幕后,因为您正在使用 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 只是一个扩展,com.fasterxml.jackson.databind.ObjectMapper
Jackson 使用它来实际将您的请求从 JSON 映射到一个对象。
我怀疑你得到了你的异常,因为你没有指定一个可以将 Octet-Stream 读入对象的映射器,或者 Spring 可以处理的东西。如果您尝试进行文件上传,那完全是另一回事。
所以我发送到我的控制器的请求看起来像这样只是有一个额外的标题,称为dataId
.
如果您想将其更改为请求参数并用于从请求@RequestParam String dataId
中读取 ID,您的请求将类似于以下内容:
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 序列化为对象,而无需编写任何代码。您可以这样做,@RequestParam
并@RequestBody
允许您分别访问参数或请求正文中的 JSON。
现在您有了一个具体的示例,一旦您将请求类型更改为application/json
.