2016-08-26 5 views
0

Мне интересно, как лучше всего создавать сообщения в контроллере на основе результата службы, до интерфейса. Я думаю в контексте java/spring с помощью контроллеров отдыха, но он также отражает модель MVC. Очевидно, что примеры, которые я видел в Интернете, - это простой способ понять, что такое лучшие практики в реальном мире. Таким образом, в случае, давайте предположим, что в следующий сценарий:Правильный способ написать контроллер

  1. У нас есть CalculateController контроллер с одним методом doMath (Int А, внутр б)
  2. У нас есть сервис CalculatorService, которые выполняют математику это самостоятельно в методе doMath (int a, int b).
  3. Мы хотим выполнить дополнительную проверку входных параметров. Метод называется validateInput (int a, int b).
  4. Мы хотим отправить как результат расчета ответа или конкретную информацию, почему это не удалось.

Так что теперь вопросы:

  1. В результате выполнения метода контроллера, я бы retuun карта объектов, которые будут анализироваться в формате JSON. Возможные объекты будут:

    { "результат": "12" }

    { "ERRORCODE": "неправильные параметры" }

это правильно, или я должен нацелены на обработку ошибок? Я знаю, что я мог бы дополнительно использовать коды ошибок http, например 400 или 406, чтобы указать, что входные параметры неверны, но лично я предпочитаю не использовать коды ошибок HTTP, чтобы указать результат логики приложения. (Я рассматриваю входную проверку как логику приложения)

  1. Где метод validateInput должен быть размещен, в контроллере или на обслуживании?
  2. В методе validateInput я хочу, чтобы проверить два упрощенных условий

а) является < б, а затем информирует пользователя с сообщением «а не может быть меньше, чем б»

б) является * a == b, а затем проинформировать пользователя с сообщением «квадрат не может быть равен b».

Как я могу предоставить дополнительное сообщение на основе результата? я могу думать о двух решениях:

  • возвратного Карта, что в случае положительного результата проверки имеет результат = верно, и в случае отрицательного результата результата = ложь, и ERRORCODE с соответствующим сообщением
  • возвращения булева значение, указывающее результат проверки, и дополнительно использовать исключения для отрицательного результата. (вопрос о бонусе, в таком случае следует исключить или исключить исключение?)

    1. Для обслуживания метода его следует обрабатывать одинаково?

ответ

1

Весна поддерживает специальную проверку. Существует аннотация @Valid. Вы можете добавить его перед своим параметром в Controller. Я покажу это на примере. Во-первых, создать класс с интерфейсом реализует Validator:

@Component 
public class MathValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> aClass) { 
     return MatchRequest.class.equals(aClass); 
    } 

    @Override 
    public void validate(Object o, Errors errors) { 
     MatchRequest request = (MatchRequest) o; 

     if (request.getValue() == null) { 
      errors.rejectValue("value", "Value cannot be empty"); 
     } 
     //add another validation logic here. 
    } 
} 

Далее, в вашем контроллере вы можете придать свой валидатор, как это:

@Autowired 
private MathValidator validator; 

и добавить этот метод с аннотацией, чтобы показать весной, которые формируют это должно проверки. Имя в аннотации - это имя параметра в методе контроллера.

@InitBinder("request") 
private void initBinder(WebDataBinder binder) { 
    binder.setValidator(routeValidator); 
} 

Позволяет сосредоточиться на методе контроллера. У нас есть параметр, аннотированный с помощью @Valid. Spring вызовет метод проверки из класса, который вы уже реализовали. Обязательно иметь второй параметр: Binding result.

@RequestMapping(value = "/math", method = RequestMethod.POST) 
     public ResponseEntity calculate(@RequestBody @Valid MatchRequest request, BindingResult result) { 
      if (result.hasErrors()) { 
       return new ResponseEntity(result.getAllErrors(), HttpStatus.BAD_GATEWAY); 
      } 

      //call service,etc. 
     } 

Также есть весенний интересный инструмент. Это аннотация @ExceptionHandler. С помощью этой аннотации вы можете отображать исключения, отбрасываемые с контроллера или службы на http-запросы. Дополнительная информация по этой теме on the official website

+0

Это действительно полезно, спасибо! Особенно исключение Handler, из того, что я прочитал, я считаю, что можно даже создать локализованные ответы в качестве ответа. –

1

О ваш вопрос 2 & 3, вы можете захотеть взглянуть на интерфейс Validator: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html

Это сообщение показывает, как используется: Spring MVC: How to perform validation?

Что касается вопроса 1, вы можете преобразовать ошибки в BindingResult в JSON и использовать это на стороне клиента для выполнения полезной обратной связи с пользователем.

Кроме того, на мой взгляд, вы не должны использовать код сбоя HTTP в этом случае, потому что ошибка ввода пользователем не является действительно ошибкой, а нормальным вариантом использования в вашем приложении.

Смежные вопросы