Spring MVC将对象作为@RequestBody发送

12 浏览
0 Comments

Spring MVC将对象作为@RequestBody发送

有人可以解释一下Spring 3中的@RequestBody@ResponseBody注解吗?它们的作用是什么?如果有示例的话就更好了。

0
0 Comments

问题:Spring MVC如何将对象作为@RequestBody发送?

原因:Spring MVC提供了@RequestBody注解,用于将请求体中的数据绑定到方法参数上。使用这个注解可以方便地将请求体中的JSON数据转换为Java对象。

解决方法:在控制器方法的参数上添加@RequestBody注解,Spring会自动将请求体中的JSON数据转换为对应的Java对象。

示例代码如下:

// 控制器
@PostMapping("/description")
public Description getDescription(@RequestBody UserStats stats){
    return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits");
}
// 领域/值对象
public class UserStats{
    private String firstName;
    private String lastName;
    // + getters, setters
}
public class Description{
    private String description;
    // + getters, setters, constructor
}

当有Jackson库在类路径中,并且配置了``,Spring会自动将请求体中的JSON数据转换为UserStats对象,并将返回的对象序列化为JSON数据。因此,浏览器/客户端将看到以下JSON结果:

{ "description" : "Elmer Fudd hates wacky wabbits" }

需要注意的是,@RequestBody和@ResponseBody不仅限于JSON格式,它们还可以处理多种格式,包括纯文本和XML,但JSON是最常用的格式。

更新:从Spring 4.x开始,通常不再在方法级别使用@ResponseBody注解,而是在类级别使用@ResponseBody注解,具有相同的效果。

Spring MVC文档中的一段引用如下:

> @RestController is a composed annotation that is itself meta-annotated with @Controller and @ResponseBody to indicate a controller whose every method inherits the type-level @ResponseBody annotation and, therefore, writes directly to the response body versus view resolution and rendering with an HTML template.

在上述链接的答案中,@RequestBody注解是在参数上使用的,而不是在方法上使用的。将@RequestBody注解添加到方法上会导致错误。因此,应该将getDescription(UserStats stats)方法放在上面。

需要注意的是,使用@RequestBody注解时,需要提供一个序列化提供程序。如果存在Jackson或JAXB,则会自动选择其中一个。其他提供程序需要进行配置。但是,Spring本身不会进行序列化操作。

0
0 Comments

Spring MVC中,我们可以使用注解来将请求的参数映射到方法中的模型对象中,从而方便地处理特定的请求调用。同时,我们也可以使用@ResponseBody注解将方法的返回值发送回请求的发起地。这两种方式都可以方便地进行映射,而无需编写自定义解析器等。

然而,在某些情况下,我们希望将一个Java对象作为请求的主体(RequestBody)发送到服务器端。上述示例中的方法并没有使用@ResponseBody注解,而是直接将MyModel对象作为方法的参数。这种情况下,Spring MVC并不会自动将请求的主体映射到MyModel对象中,从而导致了问题的出现。

为了解决这个问题,我们需要在方法参数前面加上@RequestBody注解,从而告诉Spring MVC将请求的主体映射到该参数对象中。修改后的代码如下所示:

(method = RequestMethod.POST)
public HttpStatus something(@RequestBody MyModel myModel) 
{
    return HttpStatus.OK;
}

通过添加@RequestBody注解,Spring MVC会自动将请求的主体映射到MyModel对象中,从而解决了我们想要发送对象作为RequestBody的问题。这样,我们可以方便地发送复杂的Java对象作为请求的主体,并在服务器端进行处理。

0
0 Comments

Spring MVC中的@ResponseBody和@RequestMapping注解用于处理HTTP请求和响应。当我们需要将Java对象作为请求体发送到服务器时,可以使用@RequestBody注解来将请求体绑定到方法参数上。

@RequestBody注解用于指示方法参数应绑定到HTTP请求的主体部分。这样,我们就可以将请求体的内容直接传递给方法中的参数。例如,以下代码演示了如何使用@RequestBody注解将请求体绑定到方法参数上:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
    writer.write(body);
}

在这个例子中,请求体的内容被绑定到了方法参数body上,然后通过writer将内容写入响应体。

另外,我们还可以使用@ResponseBody注解将方法的返回值直接写入HTTP响应体中,而不是将其放入Model中或解释为视图名称。例如,以下代码演示了如何使用@ResponseBody注解:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public String helloWorld() {
    return "Hello World";
}

在这个例子中,方法的返回值"Hello World"会直接写入HTTP响应体中。

此外,我们还可以使用@RestController注解来替代@ResponseBody注解。这样做可以简化代码,并且不再需要使用@ResponseBody注解。例如:

@RestController
public class MyController {
    @RequestMapping(path = "/something", method = RequestMethod.PUT)
    public String helloWorld() {
        return "Hello World";
    }
}

通过使用@RestController注解,我们可以将类标记为控制器,并且不需要在每个方法上都添加@ResponseBody注解。

总结起来,Spring MVC中的@RequestBody注解用于将请求体绑定到方法参数上,而@ResponseBody注解用于将方法的返回值直接写入HTTP响应体中。我们还可以使用@RestController注解来简化代码,不再需要使用@ResponseBody注解。

0