FieldErrors的Grails JSON编组程序

Jam*_*hon 3 grails marshalling

我正在尝试为org.springframework.validation.FieldError创建一个自定义编组器,这样我就可以避免在我的JSON响应中添加无关且可能敏感的数据,其中包括MyCommandObject.errors.

但是我的FieldError marshaller根本不工作,这就是我在initS方法下的BootStrap.groovy中所拥有的.

    def fieldErrorMarshaller = {
        log.info("field error marshaller $it")
        def returnArray = [:]

        returnArray['field'] = it.field
        returnArray['message'] = it.message

        return returnArray
    }

    JSON.registerObjectMarshaller(FieldError, fieldErrorMarshaller)
Run Code Online (Sandbox Code Playgroud)

我没有看到任何明确的错误或marshaller日志记录.知道这里可能出了什么问题吗?

Sér*_*els 5

Grails注册一个ValidationErrorsMarshaller处理所有错误的实例,因此你的FieldError编组器永远不会被调用.

//convertAnother is not called for each error. That's the reason of your custom marshalled not been called.
for (Object o : errors.getAllErrors()) {
    if (o instanceof FieldError) {
        FieldError fe = (FieldError) o;
        writer.object();
        json.property("object", fe.getObjectName());
        json.property("field", fe.getField());
        json.property("rejected-value", fe.getRejectedValue());
        Locale locale = LocaleContextHolder.getLocale();
        if (applicationContext != null) {
            json.property("message", applicationContext.getMessage(fe, locale));
        }
        else {
        ...
Run Code Online (Sandbox Code Playgroud)

查看ConvertersGrailsPlugin(插件的描述符),这被注册为Spring Bean,因此您可以创建另一个bean并使用相同的名称注册,覆盖marshalObject()以满足您的需求(未经测试,可能需要更多代码).

class MyErrorsMarshaller implements ObjectMarshaller<JSON>, ApplicationContextAware {
    ApplicationContext applicationContext;

    public boolean supports(Object object) {
        return object instanceof Errors;
    }

    public void marshalObject(Object object, JSON json) throws ConverterException {
    ...
    }

}
Run Code Online (Sandbox Code Playgroud)

resources.groovy

jsonErrorsMarshaller(MyErrorsMarshaller)

errorsJsonMarshallerRegisterer(ObjectMarshallerRegisterer) {
    marshaller = { MyErrorsMarshaller om -> }
    converterClass = grails.converters.JSON
}
Run Code Online (Sandbox Code Playgroud)

ValidationErrorsMarshaller的参考.

ConvertersGrailsPlugin的参考.