Micronaut 处理表单数据

2023-03-06 16:27 更新

为了使数据绑定模型自定义在表单数据和 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 注释来排除不应绑定的属性。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号