Spring инициализирует интерфейс ошибок в классе контроллера - PullRequest
0 голосов
/ 16 мая 2018

У меня проблема с некоторыми проверками, которые я выполняю в своем проекте.Я пытаюсь проверить некоторые аргументы внутри объекта, который я создал в моем контроллере, в первую очередь получая строку.

@RequestMapping(value = "/publicar", method = { RequestMethod.GET, RequestMethod.POST }, produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public ApiPubPortalPublicarOut publicar(@RequestParam(value = PARAM_XML) String xml, Locale locale) {
            //This object is my return, it creates an XML with the validation.
            ApiPubPortalPublicarOut xmlTaxOut = new ApiPubPortalPublicarOut();
            Errors result = null; //Here is the problem

            //validate incoming xml is empty
            if ((xml == null) || (xml.length() == 0)) {
                xmlTaxOut.setDescription("xml is Empty!");
                return xmlTaxOut;
            }else{
                try{
                    //I transform the xml into an object
                    JAXBContext jc = JAXBContext.newInstance(ApiPubPortalPublicarPortal.class);
                    Unmarshaller unmarshaller = jc.createUnmarshaller();
                    StreamSource streamSource = new StreamSource(new StringReader(xmlEntrada));
                    JAXBElement<ApiPubPortalPublicarPortal> je = unmarshaller.unmarshal(streamSource, ApiPubPortalPublicarPortal.class);

                    //Here is the validation method.
                     parsingPublicacion(je.getValue(), result, locale);
                     if(result.hasErrors()){
                        xmlTaxOut.setDescription(result.getAllErrors().toString());
                        return xmlTaxOut;
                     }
                }catch(Exception){
                    xmlTaxOut.setDescription("Error parsing!");
                    return xmlTaxOut;
                }
            }
        }

Это мой контроллер, как вы можете видеть, я пытаюсь преобразовать свою строку в объект, затем я вызываю метод parsingPublicacion, чтобы выполнить мои проверки.

Основная проблема в том, что я не могу инициализировать свой параметр Errors, потому что это интерфейс, кто-нибудь знает, как я могу управлять этой проверкой?

Это метод проверки вали.

private void parsingPublicacion(ApiPubPortalPublicarPortal portalPublicado,  Errors e, Locale locale) {
    ApiPubPortalPublicarPortal pubPortal = portalPublicado;

    ValidationUtils.rejectIfEmptyOrWhitespace(e, "name", "name.empty"));
    if (pubPortal.getNombre().length() > 50){
        e.rejectValue("name", "name.oversize");
    }

    ValidationUtils.rejectIfEmptyOrWhitespace(e, "idLanguage.empty");
    if ((pubPortal.getIdPortal() == 0)){
        e.rejectValue("idLanguage", "idLanguage.zero"));
    }

}

Я не могу вызвать ошибки из метода, потому что я разрешил вызывать только определенные параметры в контроллере.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Редактировать 2 Поскольку у вас нет атрибута модели, вам нужно использовать конкретный класс, который реализует ошибки. BeanPropertyBindingResult такой.

Вы можете использовать BeanPropertyBindingResult следующим образом

@RequestMapping(value = "/publicar", method = { RequestMethod.GET, RequestMethod.POST }, produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public ApiPubPortalPublicarOut publicar(@RequestParam(value = PARAM_XML) String xml, Locale locale) {
    //This object is my return, it creates an XML with the validation.
    ApiPubPortalPublicarOut xmlTaxOut = new ApiPubPortalPublicarOut();


    //validate incoming xml is empty
    if ((xml == null) || (xml.length() == 0)) {
        xmlTaxOut.setDescription("xml is Empty!");
        return xmlTaxOut;
    }else{
        try{
            //I transform the xml into an object
            JAXBContext jc = JAXBContext.newInstance(ApiPubPortalPublicarPortal.class);
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            StreamSource streamSource = new StreamSource(new StringReader(xmlEntrada));
            JAXBElement<ApiPubPortalPublicarPortal> je = unmarshaller.unmarshal(streamSource, ApiPubPortalPublicarPortal.class);

            // Using concrete implementation of error interface
            BeanPropertyBindingResult result = new BeanPropertyBindingResult(je.getValue(), "apiPubPortal");


            //Here is the validation method.
            parsingPublicacion(je.getValue(), result, locale);
            if(result.hasErrors()){
                xmlTaxOut.setDescription(result.getAllErrors().toString());
                return xmlTaxOut;
            }
        }catch(Exception){
            xmlTaxOut.setDescription("Error parsing!");
            return xmlTaxOut;
        }
    }
}

Редактировать 1 Вы также можете использовать интерфейс Error как параметр метода. И Spring по-прежнему будет заполнять реализацию.

Используйте BindigResults в качестве аргумента метода и используйте его в местах Ошибка . Spring автоматически заполнит реализацию для вас.

@RequestMapping(value = "/publicar", method = { RequestMethod.GET, RequestMethod.POST }, produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public ApiPubPortalPublicarOut publicar(@RequestParam(value = PARAM_XML) String xml,
                                        BindingResult result, Locale locale) {
            //This object is my return, it creates an XML with the validation.
            ApiPubPortalPublicarOut xmlTaxOut = new ApiPubPortalPublicarOut();
            // Use BindingResult in places of erros


        }

BindingResult расширяет ошибки, поэтому в нем будут присутствовать функции ошибок.

https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-arguments

0 голосов
/ 16 мая 2018
You can Binding Result & FieldErrors instead of Errors. Please find the below code.

private void parsingPublicacion(ApiPubPortalPublicarPortal portalPublicado,  BindingResult bindingResult, Locale locale) {
    ApiPubPortalPublicarPortal pubPortal = portalPublicado;
    String[] codes = {"errorCode"};
    ValidationUtils.rejectIfEmptyOrWhitespace(e, "name", "name.empty"));
    if (pubPortal.getNombre().length() > 50){
        e.rejectValue("name", "name.oversize");
        bindingResult.addError(new FieldError(Yourclass.getSimpleName(),"Name", pubPortal.getNombre(), false , codes , null , "name.oversize"));
    }

    ValidationUtils.rejectIfEmptyOrWhitespace(e, "idLanguage.empty");
    if ((pubPortal.getIdPortal() == 0)){
        e.rejectValue("idLanguage", "idLanguage.zero"));
        bindingResult.addError(new `enter code here`FieldError(Yourclass.getSimpleName(),"idLanguage", pubPortal.getIdPortal(), false , codes , null , "idLanguage.zero"));
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...