2016-10-13 5 views
0

私は最初の春のアプリケーションを書いており、春に最適で魅力的なコードを作る経験を積みたいと思います。 私は同様のコードRESTコントローラのパターンを作る方法

@RequestMapping(path = "/1154", 
       method = RequestMethod.POST, 
       headers = {"Content-Type=application/json"}, 
       consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, 
       produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 

     public CreateUserResp processRequest(@RequestBody @Valid CreateUserReq request, BindingResult bindingResult) { 

      CreateUserResp response = new CreateUserResp(); 

      if (bindingResult.hasErrors()){ 

       response.setResultCode(102); // Validation error 
       response.setErrMsg("Wrong " + bindingResult.getFieldError().getDefaultMessage() + " value."); 

      } else { 
        // main service 
        request = UserService.doSomething(); 

      } 
      return response; 
     } 

@RequestMapping(path = "/1155", 
       method = RequestMethod.POST, 
       headers = {"Content-Type=application/json"}, 
       consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, 
       produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 

     public ChangeUserResp processRequest(@RequestBody @Valid ChangeUserReq request, BindingResult bindingResult) { 

      ChangeUserResp response = new ChangeUserResp(); 

      if (bindingResult.hasErrors()){ 

       response.setResultCode(102); // Validation error 
       response.setErrMsg("Wrong " + bindingResult.getFieldError().getDefaultMessage() + " value."); 

      } else { 
        // main service 
        request = ChangeService.doSomething(); 

      } 
      return response; 
     } 

@RequestMapping(path = "/1156", 
       method = RequestMethod.POST, 
       headers = {"Content-Type=application/json"}, 
       consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, 
       produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 

     public AddUserResp processRequest(@RequestBody @Valid AddUserReq request, BindingResult bindingResult) { 

      AddUserResp response = new AddUserResp(); 

      if (bindingResult.hasErrors()){ 

       response.setResultCode(102); // Validation error 
       response.setErrMsg("Wrong " + bindingResult.getFieldError().getDefaultMessage() + " value."); 

      } else { 
        // main service 
        request = AddService.doSomething(); 

      } 
      return response; 
     } 

@RequestMapping(path = "/1157", 
       method = RequestMethod.POST, 
       headers = {"Content-Type=application/json"}, 
       consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, 
       produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 

     public ModifyUserResp processRequest(@RequestBody @Valid ModifyUserReq request, BindingResult bindingResult) { 

      ModifyUserResp response = new ModifyUserResp(); 

      if (bindingResult.hasErrors()){ 

       response.setResultCode(102); // Validation error 
       response.setErrMsg("Wrong " + bindingResult.getFieldError().getDefaultMessage() + " value."); 

      } else { 
        // main service 
        request = ModifyService.doSomething(); 

      } 
      return response; 
     } 

などの大きな部分を持っているいくつかのrestcontrollersを....まし

で唯一の違い(パス、@RequestBodyとResponceオブジェクトは、と呼ばれるサービス)。だから、私はこのような10-12コントローラを持っています。このコードをより最適にする方法であり、コードのこの繰り返しブロックを10回書くことはありません(スプリングメソッドまたはジェネリッククラスまたはメソッドを使用している可能性があります)。これは単なる例であり、実際のコードではありません。 Thx

答えが非常に忙しいが、マイナスを置く時間がある人に特に感謝します。

+0

すべてのリクエストメソッドのエラーを処理するウォッチャ? – Lucas

+0

はい、ちょうど同じ構造です。私は、検証のために入ってくるjsonオブジェクトのpojoオブジェクトを変更します。また、着信要求はコントローラのパスに依存します。レスポンスはリクエストオブジェクトに依存します – koa73

+0

'@ RequestMapping'のためのクラスにすべてのcommenを入れると' @ RequestMapping'メソッドの違いしか定義されません。それに続いて、メソッドは異なっています。何かがスメを見ても同じではないという事実です。あなたはこのレベルで物事を生成することができますあなたは何か間違ったイホをしている... –

答えて

0

私のアプリケーションにはかなり似ています。

たとえば、これはユーザコントローラからの私のeditProfile方法がどのように見えるかです:

@PostMapping(value = EDIT_CONTACT_INFO) 
public ResponseEntity<?> editContactInfo(
     @Autowired HttpServletRequest httpServletRequest, 
     @RequestBody @Valid ContactInfoDTO.Req requestBody, 
     BindingResult bindingResult 
) 
{ 
    if (bindingResult.hasErrors()) 
     // 400 - BAD REQUEST 
     return ErrorsDTO.from(bindingResult).responseEntity(); 

    String userName = ControllerUtils.getUserName(httpServletRequest); 
    User user = userService.findByUserName(userName); 
    ContactInfo contactInfo = modelMapper.map(requestBody, ContactInfo.class); 

    if (!userService.editContactInfo(user, contactInfo)) 
     // 500 - INTERNAL SERVER ERROR 
     return ErrorsDTO.from(INTERNAL_SERVER_ERROR).responseEntity(); 

    // 200 - OK 
    return ResponseEntity.ok(null); 
} 

私のAPIの大半はあなたに非常に似ています。私はちょうどエラーを報告する私のカスタムメカニズムを書いた、私はResponseEntityインスタンスを使用してデータを返す。

また、DTOから私のモデルにデータを渡し、ModelMapperと呼ばれるライブラリを持っています。

+0

Thx、しかし、私は別のコントローラでContactInfoDTO.Reqを変更する必要があります – koa73

0

編集:新しい注釈ValidateBinding上のポイントカットで、 http://blog.codeleak.pl/2013/09/request-body-validation-in-spring-mvc-3.2.html


あなたが本当にダウン取得したい場合や汚れ、あなたがインターセプタを書くことができます:それは、このブログ投稿のように見えるあなたの質問をカバーBindingResultの引数

@Around("@annotation(ValidateBinding) && execution(* *(..)) && args(bindingResult) 
public Object handleInvalidBindings(ProceedingJoinPoint p, BindingResult bindingResult) { 

    if (bindingResult.hasErrors()){ 
     GenericResponse response = createTypedResponse(p); 
     response.setResultCode(102); // Validation error 
     response.setErrMsg("Wrong " + bindingResult.getFieldError().getDefaultMessage() + " value."); 
     return response; 
    } 
    return pjp.proceed(); 
} 

private GenericResponse createTypedResponse(ProceedingJoinPoint p) { 
    MethodSignature signature = (MethodSignature) p.getSignature(); 
    Method method = signature.getMethod(); 
    Class responseClass = method.getReturnType(); 
    if(!GenericResponse.class.isAssignableFrom(responseClass)) { 
     throw new IllegalArgumentException("Could not create proper response class - it should implement the GenericResponse interface"); 
    return (GenericResponse) responseClass.newInstance(); 
} 

しかし、私は表現やコードの動作を保証していません。これはどのように見えるかについての大まかな推測です。

これを行うには、レスポンスによって実装されているインターフェイスGenericResponseが必要で、setResultCodeとsetErrMsgがあります。

+0

Thxしかし、私は明らかに説明されていないかもしれない私の質問(または私didn 'あなたの答えを理解していない)。私は問題のコードを変更しました。私はそれをよりコンパクトにするための繰り返し可能なコードのパターンを作る方法を見つけることを試みています。 – koa73

+0

ジェネリックコードを使用する場合は、すべての応答も「汎用」にする必要があります。または、少なくともエラー処理部分。特定のレスポンスが必要なので、どのような種類のレスポンスが必要かを判断するためのコードです。考えてみると、呼び出されるメソッドの反映からすべてのことを得ることができるので、コードを少しきれいにする必要があります。しかし、それは反射と回避策なので、ちょっと汚いです... 他の人は言っているように、あなたの現在のコードは*一般的ではありません。 –

関連する問題