gpt4 book ai didi

java - 将 Spring MVC 投影与 JSON 和 Jackson 结合使用

转载 作者:搜寻专家 更新时间:2023-11-01 03:36:45 25 4
gpt4 key购买 nike

在新版本的 Spring Data (Fowler) 中,可以将接口(interface)传递给 Spring MVC Controller 操作,然后 Spring Data 将自动创建代理实现并将值绑定(bind)到该代理对象。

An example is given在描述 Spring Data Fowler 中的一些新功能的博客文章中:

interface Form {
@NotBlank String getName();
@NotBlank String getText();
}

@Controller
@RequestMapping(value = "/guestbook")
class GuestbookController {
@RequestMapping(method = RequestMethod.GET)
String guestbook(Form form, Model model) { ... }

@RequestMapping(method = RequestMethod.POST)
String guestbook(@Valid Form form, Errors errors, Model model) { ... }
}

我的问题是在使用 Jackson 反序列化 JSON 时是否也可以这样做?例如,像这样:

interface Form {
@NotBlank String getName();
@NotBlank String getText();
}

@Controller
@RequestMapping(value = "/guestbook")
class GuestbookController {
@RequestMapping(method = RequestMethod.POST)
String guestbook(@Valid @RequestBody Form form) { ... }
}

但是,这给出了以下异常:

Can not construct instance of Form, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information

我明白问题出在哪里,但是有没有不需要我创建一个实现我的接口(interface)的类或编写大量代码的解决方案?一个是 simpler than this approach .因为否则我还不如使用 DTO 方法,但我发现如果我可以像示例中那样简单地使用一个接口(interface),那将是非常酷的。

我可以通过上述方法很好地使用 DTO 类(或避免使用 JSON),但使用博客文章示例中的接口(interface)会很简洁。但是,在反序列化 JSON 时,使用 Jackson 库是否可行?

最佳答案

你可以使用 Jackson Mr Bean module ,这正是您想要的。

要使用它,只需下载特定的依赖项并将其设置为底层 ObjectMapper 实例的模块:

import java.io.IOException;
import java.util.List;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.mrbean.MrBeanModule;

public class AbstractPojosExample {

public interface Person {

String getName();

int getAge();

Address getAddress();

default String asString() {
return String.format("%s, %d, %s", this.getName(), this.getAge(), this.getAddress().asString());
}
}

public interface Address {

String getStreet();

String getCity();

default String asString() {
return String.format("%s, %s", this.getStreet(), this.getCity());
}
}

private void run() throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new MrBeanModule());

String json = "[ { \"name\": \"John\", \"age\": 23, "
+ "\"address\": { \"street\": \"1001 5th Ave\", \"city\": \"New York\" } }, "
+ "{ \"name\": \"Jean Jacques\", \"age\": 26 , "
+ "\"address\": { \"street\": \"1001 Champs Elysees Blvd\", \"city\": \"Paris\" } }, "
+ "{ \"name\": \"Oscar Ruben\", \"age\": 54, "
+ "\"address\": { \"street\": \"1001 9th July Ave\", \"city\": \"Buenos Aires\" } } ]";
System.out.println(json);

List<Person> people = mapper.readValue(json, new TypeReference<List<Person>>() {});

people.stream().map(Person::asString).forEach(System.out::println);
}

public static void main(String[] args) throws IOException {
AbstractPojosExample example = new AbstractPojosExample();
example.run();
}
}

对于给定的 json:

[
{
"name": "John",
"age": 23,
"address": {
"street": "1001 5th Ave",
"city": "New York"
}
},
{
"name": "Jean Jacques",
"age": 26,
"address": {
"street": "1001 Champs Elysees Blvd",
"city": "Paris"
}
},
{
"name": "Oscar Ruben",
"age": 54,
"address": {
"street": "1001 9th July Ave",
"city": "Buenos Aires"
}
}
]

上面的小程序产生以下输出:

John, 23, 1001 5th Ave, New York
Jean Jacques, 26, 1001 Champs Elysees Blvd, Paris
Oscar Ruben, 54, 1001 9th July Ave, Buenos Aires

关于java - 将 Spring MVC 投影与 JSON 和 Jackson 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29335264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com