本文介紹了用Spring解碼車身參數的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在使用Spring為Slack App開發一個rest API后端。我能夠接收來自Slack的消息(斜杠命令),但我無法正確接收組件交互(按鈕單擊)。
official documentation表示:
您的操作URL將收到一個HTTP POST請求,其中包括一個負載正文參數,該參數本身包含一個應用程序/x-www-form-urlencode JSON字符串。
因此,我寫了以下@RestController
:
@RequestMapping(method = RequestMethod.POST, value = "/actions", headers = {"content-type=application/x-www-form-urlencoded"})
public ResponseEntity action(@RequestParam("payload") ActionController.Action action) {
return ResponseEntity.status(HttpStatus.OK).build();
}
@JsonIgnoreProperties(ignoreUnknown = true)
class Action {
@JsonProperty("type")
private String type;
public Action() {}
public String getType() {
return type;
}
}
但是,我收到以下錯誤:
Failed to convert request element: org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'controllers.ActionController$Action'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'controllers.ActionController$Action': no matching editors or conversion strategy found
這是什么意思,如何解決?
json
您會收到一個包含推薦答案內容的字符串。您沒有收到JSON輸入,因為application/x-www-form-urlencoded
用作內容類型,而不是application/json
,如上所述:
您的操作URL將收到一個HTTP POST請求,包括有效負載
Body參數,本身包含一個應用程序/x-www-form-urlencode
JSON字符串。
因此將參數類型更改為String
,并使用Jackson或任何JSON庫將String
映射到Action
類:
@RequestMapping(method = RequestMethod.POST, value = "/actions", headers = {"content-type=application/x-www-form-urlencoded"})
public ResponseEntity action(@RequestParam("payload") String actionJSON) {
Action action = objectMapper.readValue(actionJSON, Action.class);?
return ResponseEntity.status(HttpStatus.OK).build();
}
正如pvpkiran建議的那樣,如果您可以直接在POST請求的主體中傳遞JSON字符串,而不是作為參數值,那么您可以將@RequestParam
替換為@RequestBody
,但情況似乎并非如此。
實際上,通過使用@RequestBody
,請求的主體通過HttpMessageConverter
傳遞以解析方法參數。
作為對您的評論的回應,Spring MVC并沒有提供一種非常簡單的方法來滿足您的需求:將字符串JSON映射到您的Action
類。
但是,如果您真的需要自動執行此轉換,您可以使用the Spring MVC documentation中所述的冗長替代方法,例如ForMatters(我的重點是):
表示基于字符串的一些帶注釋的控制器方法參數
請求輸入?-?,例如@RequestParam
、@RequestHeader
、@PathVariable
、
@MatrixVariable,
和@CookieValue
,如果
參數聲明為字符串以外的內容。對于這種情況,類型轉換將根據
已配置的轉換器。默認情況下,簡單類型,如int、long
支持日期等。類型轉換可以通過
WebDataBinder,請參見DataBinder,或通過將ForMatters注冊到
FormattingConversionService,請參閱Spring字段格式設置。
通過為Action
類創建一個格式化程序(FormatterRegistry
子類),您可以將其添加到Spring Web配置as documented:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// ... add action formatter here
}
}
并在參數聲明中使用它:
public ResponseEntity action(@RequestParam("payload") @Action Action actionJ)
{...}
這篇關于用Spring解碼車身參數的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,