codecamp

Micronaut 处理表单数据

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


Micronaut API 版本控制
Micronaut 写入响应数据
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Micronaut 独立命令行应用程序

Micronaut 安全

Micronaut 多租户

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }