The difference in Spring MVC mode
Java chassis supports the use of the label (org.springframework.web.bind.annotation) provided by Spring MVC to declare the REST interface, but the two are independent implementations and have different design goals. The goal of the java chassis is to provide a cross-language framework that supports multiple communication protocols. Therefore, some features of Spring MVC that are not very good for cross-language support are removed, and features that are strongly related to a specific running framework are not supported, such as direct access to the Servlet protocol definition. HttpServletRequest. Here are some notable differences.
- Service declaration method
Spring MVC uses @RestController to declare the service, and java chassis uses @RestSchema to declare the service and needs to display the service path using @RequestMapping to distinguish whether the service uses Spring MVC Annotations or JAX RS Annotations.
@RestSchema(schemaId = "hello")
@RequestMapping(path = "/")
The schema is the service contract of java chassis, which is the basis of service runtime. Service management, codec and so on are all based on contract. In a cross-language scenario, the contract also defines the parts of the language that can be understood simultaneously.
- Data type support
With Spring MVC, you can use multiple data types in a service definition as long as it can be serialized and deserialized by json. Such as:
// abstract type
Public void postData(@RequestBody Object data)
// Interface definition
Public void postData(@RequestBody IPerson interfaceData)
// Generics tpye without specified type
Public void postData(@RequestBody Map rawData)
// specific protocol related types
Public void postData(HttpServletRequest request)
The above types are not supported in the java chassis. Because java chassis will generate contracts according to the interface definition, from the above interface definition, if you do not combine the actual implementation code or additional development documentation, you can not directly generate the contract. That is, standing in the REST perspective of the browser, I don't know how to construct the message content in the body.
To support rapid development, the data type restrictions of java chassis are also constantly expanding, such as support for HttpServletRequest, but when they are used, they are different from the semantics of the WEB server, such as the inability to directly manipulate the stream. Therefore, it is recommended that the developer use the type of contract that can be described as much as possible in the usage scenario so that the code is more readable.
For more information on java chassis support for data types, please refer to the "Supported Data Types" section.
- Common Annotation Support
The following is the java chassis support for Spring MVC common annotation.
Tag Name | Support | Description |
---|---|---|
RequestMapping | Yes | |
GetMapping | Yes | |
PutMapping | Yes | |
PostMapping | Yes | |
DeleteMapping | Yes | |
PatchMapping | Yes | |
RequestParam | Yes | |
CookieValue | Yes | |
PathVariable | Yes | |
RequestHeader | Yes | |
RequestBody | Yes | Currently supports application/json,plain/text |
RequestPart | Yes | For file upload scenarios, the corresponding tags are Part, MultipartFile |
ResponseBody | No | The return value defaults to the body return |
ResponseStatus | No | The error code returned can be specified by ApiResponse |
RequestAttribute | No | Servlet Protocol Related Tags |
SessionAttribute | No | Servlet Protocol Related Tags |
MatrixVariable | No | |
ModelAttribute | No | |
ControllerAdvice | No | |
CrossOrigin | No | |
ExceptionHandler | No | |
InitBinder | No |
- Other
Using POJO objects for parameter mapping in GET methods is not supported.
For example: public void getOperation(Person p)
Do not support the use of Map mapping in the GET method for all possible parameters.
For example: public void getOperation(Map<String,String> p)