gpt4 book ai didi

java - 使用 Spring 和 Jackson 进行错误处理

转载 作者:行者123 更新时间:2023-11-29 09:00:58 25 4
gpt4 key购买 nike

我在使用 Spring 和 Jackson 生成正确的错误消息时遇到了问题。场景:具有自定义模型的 Controller @ResponseBody(见下文)具有两个属性的模型,这可能会导致解析错误。现在,如果这些字段的解析失败(例如,得到了 Date 的无效字符串),我想返回一条正确的错误消息。

如果发生解析错误,Spring 将捕获它并返回带有 HTML 正文的 400 Bad Request 响应。虽然我能够实现自己的 HandlerExceptionResolver,但它会捕获此类异常以生成有意义的错误消息。不幸的是,我只能捕捉到第一个解析错误,可能无法捕捉到第二个。

那么,有没有一种方法可以收集所有解析/反序列化错误,并针对所有问题生成正确的错误消息?

我正在使用 Jackson 1.7.1 和 Spring 3.2.2。


一些示例代码:

TimeController.java

@Controller
@RequestMapping("/time")
public class TimeController {
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody
TimeDocument create(@RequestBody TimeDocument entity) {
// magic
return entity;
}
}

TimeDocument.java

public class TimeDocument {
public String name;
public Date date1;
public Date date2;
}

请求 1:我会得到一个 200 OK

{
"name": "test",
"date1": 123,
"date2": 1234
}

请求 2:我将收到 400 Bad Request,但我能够生成正确的错误消息,例如:“日期 1 的格式无效。”。

{
"name": "test",
"date1": "crap",
"date2": 1234
}

请求 3:我将收到 400 Bad Request,但我无法生成正确的错误消息,例如:“日期 1 的格式无效。日期2 的格式无效。”。

{
"name": "test",
"date1": "crap",
"date2": "crap"
}

最佳答案

好吧,我认为您最好使用 Spring MVC Form Validation 或仅使用 jquery.validate 在客户端验证 input 值插件(由于 @ResponseBody 用法,我只是假设您正在使用 jQuery)。

否则,我想到的另一个解决方案是实现如下内容:

(首先,为您的实体中的新字段添加一个gettersetter > 调用了将存储验证结果的 message

然后:

@Controller
@RequestMapping("/time")
public class TimeController {
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody String create(@RequestBody TimeDocument entity) {

String json = null;

try {

//1. Create 'jackson' object mapper
ObjectMapper objectMapper = new ObjectMapper();

//2. Capture data from your entity
String name = entity.getName();
Date date1 = entity.getDate1();
Date date2 = entity.getDate2();

//3. Validate 'name', 'date1', 'date2' with some regex (a possibility) or any method you want.

//4. Suppossing that you implemented a method like this to validate your 'bean' or 'dto' that returns 'boolean'
if(!validate(entity)) {

//5. If everything is not according to your validation rules, set a message to your entity.
entity.setMessage("There was an error in the input values.");
}

//6. Convert your 'bean' or 'dto' as 'json' string
json = objectMapper.writeValueAsString(entity);

} catch (Exception ex) {
//handle the Exception
}

return json;
}
}

现在,在客户端(假设您正在使用 jQuery ajax 或只是 $.post)。

回调中执行以下操作:

(..), function(data) {
if(data != null) { //Callback is not null

//Parse the 'String' result from 'Controller' as 'JSON' from 'Jackson'
var obj = $.parseJSON(data);

if(obj.message != '') {
alert(obj.message) //An error ocurred in the validation.
} else {
//Show the data
alert('Name: ' + obj.name + ' Date1: ' + obj.date1 + ' Date2: ' + obj.date2);
}
}
});

因此,如果实体中没有message,则意味着没有error。我会建议这样做,并考虑我在第一行中写的内容,以便在 clientserver 端进行非常好的验证。

关于java - 使用 Spring 和 Jackson 进行错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478587/

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