为了使数据绑定模型自定义在表单数据和 JSON 之间保持一致,Micronaut 使用 Jackson 从表单提交中实现绑定数据。
这种方法的优点是用于自定义 JSON 绑定的相同 Jackson 注释可用于表单提交。
实际上,这意味着要绑定常规表单数据,对先前 JSON 绑定代码所需的唯一更改是更新使用的 MediaType:
将表单数据绑定到 POJO
Java |
Groovy |
Kotlin |
@Controller("/people")
public class PersonController {
Map<String, Person> inMemoryDatastore = new ConcurrentHashMap<>();
@Post
public HttpResponse<Person> save(@Body Person person) {
inMemoryDatastore.put(person.getFirstName(), person);
return HttpResponse.created(person);
}
}
|
@Controller("/people")
class PersonController {
Map<String, Person> inMemoryDatastore = new ConcurrentHashMap<>()
@Post
HttpResponse<Person> save(@Body Person person) {
inMemoryDatastore.put(person.getFirstName(), person)
HttpResponse.created(person)
}
}
|
@Controller("/people")
class PersonController {
internal var inMemoryDatastore: MutableMap<String, Person> = ConcurrentHashMap()
@Post
fun save(@Body person: Person): HttpResponse<Person> {
inMemoryDatastore[person.firstName] = person
return HttpResponse.created(person)
}
}
|
为避免拒绝服务攻击,绑定期间创建的集合类型和数组受配置文件(例如 application.yml)中的设置 jackson.arraySizeThreshold 限制
或者,除了使用 POJO,您还可以将表单数据直接绑定到方法参数(这也适用于 JSON!):
将表单数据绑定到参数
Java |
Groovy |
Kotlin |
@Controller("/people")
public class PersonController {
Map<String, Person> inMemoryDatastore = new ConcurrentHashMap<>();
@Post("/saveWithArgs")
public HttpResponse<Person> save(String firstName, String lastName, Optional<Integer> age) {
Person p = new Person(firstName, lastName);
age.ifPresent(p::setAge);
inMemoryDatastore.put(p.getFirstName(), p);
return HttpResponse.created(p);
}
}
|
@Controller("/people")
class PersonController {
Map<String, Person> inMemoryDatastore = new ConcurrentHashMap<>()
@Post("/saveWithArgs")
HttpResponse<Person> save(String firstName, String lastName, Optional<Integer> age) {
Person p = new Person(firstName, lastName)
age.ifPresent({ a -> p.setAge(a)})
inMemoryDatastore.put(p.getFirstName(), p)
HttpResponse.created(p)
}
}
|
@Controller("/people")
class PersonController {
internal var inMemoryDatastore: MutableMap<String, Person> = ConcurrentHashMap()
@Post("/saveWithArgs")
fun save(firstName: String, lastName: String, age: Optional<Int>): HttpResponse<Person> {
val p = Person(firstName, lastName)
age.ifPresent { p.age = it }
inMemoryDatastore[p.firstName] = p
return HttpResponse.created(p)
}
}
|
正如您从上面的示例中看到的那样,这种方法允许您使用诸如支持 Optional 类型和限制要绑定的参数等功能。使用 POJO 时,您必须小心使用 Jackson 注释来排除不应绑定的属性。
更多建议: