2017-12-25 2 views
2

나는이 코드 조각이 :자바 - JSON 날짜 확인 방법

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") 
    protected Date statusDate; 

을하지만, 어떻게 든 그것을 같은 날짜 형식 허용 -

"statusDate": "2017-13-27" 

또는

"statusDate": "201823-12-12" 

요청 내에서 형식을 확인하는 것이 가능을 (수동이 아닌)?

+1

는 요청 내에서 형식을 검증 할 수 있습니까? 정교하게 제발 주시겠습니까? 페이로드에 날짜를 보내는 동안 클라이언트 쪽에서 유효성 검사를 의미합니까? – Abhijeet

+0

좋은 점 - 아니요. 데이터를 가져 오기 전에 유효성 검사 문제가있는 경우 예외가 발생합니다. – Dvir

+0

후자는 유효한 날짜입니다 (나중에 약간 있습니다). – Henry

답변

1

글쎄, 사용자 정의 날짜 직렬화/역 직렬화 클래스를 작성하고 데이터를 가로 채고있는 동안 수신 한 날짜 형식이 예상 한 것이 아니면 사용자 정의 예외를 throw해야합니다.

This 대답은 올바른 방법을 알려줍니다.

코드에서 유효성 검사기를 사용하여 페이로드의 유효성을 검사하고 Jackson을 단순한 상태로 둘 수 있습니다.

1

예, 가능합니다. 세부 사항을 보여 드리겠습니다.

먼저 PLS 아래와 같이 모든 요청 필터링 기지국 제어기 생성 : 위의 코드에서

package com.letv.address.controller; 

import com.letv.address.utils.ConstantCode; 
import com.letv.address.utils.ResponseWrapper; 
import com.letv.xice.core.controller.GlobalController; 
import org.springframework.validation.BindingResult; 
import org.springframework.validation.FieldError; 
import org.springframework.validation.ObjectError; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by shichaoyang on 2017/1/10. 
*/ 
public class BaseController extends GlobalController { 

public ResponseWrapper requestCheckAndPost(BindingResult result) { 

    if (result.hasErrors()) { 

     List<Object> errorList = new ArrayList<>(); 

     StringBuilder sBuilder = new StringBuilder(); 

     for (ObjectError error : result.getAllErrors()) { 

      String fieldName = ((FieldError) error).getField(); 
      String fieldMessage = error.getDefaultMessage(); 

      sBuilder.append(fieldName) 
        .append(" ") 
        .append(getMessage(fieldMessage)) 
        .append(";"); 

      errorList.add(fieldName); 
     } 

     return new ResponseWrapper(
        ConstantCode.FAILING_WITH_ERROR_PARAM_CODE 
       , errorList.toArray() 
       , "" 
       , sBuilder.toString() 
       ); 
    } 
    return null; 
    } 
} 

를 상기 BindingResult는 @NotBlank, @Pattern 등처럼 @JsonFormat 또는 다른 성분 헤더를 검사 할 것이다 에. 규칙을 위반하면 BindingResult에 의해 캐치되며 오류가 발생할 수 있습니다.

package com.letv.address.controller.dto; 

import com.letv.address.utils.ConstantCode; 
import org.hibernate.validator.constraints.NotBlank; 

/** 
* Created by shichaoyang on 2016/12/23. 
*/ 
public class ChildrenAreaSelectRequest{ 

@NotBlank(message = ConstantCode.REQUEST_VALIDATE_NOT_EMPTY) 
private String areaIds; 

public String getAreaIds() { 
    return areaIds; 
} 

public void setAreaIds(String areaIds) { 
    this.areaIds = areaIds; 
    } 
} 

그런 다음 우리의 비즈니스 로직 컨트롤러, 우리는 다음과 같은 코드를 기본 컨트롤러를 확장하고 작성해야합니다 : 다음은 내가 사용하는 DTO 객체가, 그냥 당신이 더 많은 정보를 얻을 수 있도록 U에게 보여

package com.letv.address.controller; 

import com.letv.address.controller.dto.ChildrenAreaSelectRequest; 
import com.letv.address.controller.dto.ParentAreaSelectReqeust; 
import com.letv.address.domain.Area; 
import com.letv.address.service.ChildAreaService; 
import com.letv.address.utils.ConstantCode; 
import com.letv.address.utils.ResponseWrapper; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.annotation.*; 
import javax.validation.Valid; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by shichaoyang on 2016/12/12. 
*/ 
@RestController("areaController") 
public class AreaController extends BaseController { 

@Autowired 
protected ChildAreaService childAreaService; 

/** 
* get area info by parent id 
* 
* @param areaReqeust 
* @param result 
*/ 
@ResponseBody 
@RequestMapping(value = ConstantCode.CHILD_AREA_PATH, method = {RequestMethod.POST}) 
public ResponseWrapper childArea(@RequestBody @Valid ParentAreaSelectReqeust areaReqeust, BindingResult result) { 

    ResponseWrapper validationWrapper = requestCheckAndPost(result); 
    if (validationWrapper != null) { 
     return validationWrapper; 
    } 

    List<Area> areaList = childAreaService.selectByParentId(areaReqeust.getParentId()); 
    if (areaList == null || areaList.size() == 0) { 
     return new ResponseWrapper(ConstantCode.SUCCESS_WITH_EMPTY_DATA_CODE, new ArrayList<>()); 
    } else { 
     return new ResponseWrapper(ConstantCode.SUCCESS_WITH_FILL_DATA_CODE, areaList); 
    } 
    } 
} 

위의 방법을 사용하면 요청 내에서 필드의 유효성을 쉽게 확인할 수 있습니다. 이것은 이것을 달성하는 아름다운 방법입니다.

희망이 있습니다.

편집 : 사람이 그것을 테스트 할 필요가 있도록

실제 코드로 이미지를 교체합니다.

+0

코드를 답안에 붙여주십시오. 일부는 복사하여 붙여 넣기를 원할 수 있습니다. –

+0

@ OleV.V. 물론. 업데이트했습니다. Pls는 확인하고 확인합니다. 나에게 도움을 보내고 싶을 때 편리하다. – CharlieShi

+0

감사합니다 (아직 테스트하지는 않았지만). –

1

@JsonFormat은 statusDate를 응답으로 반환 할 때 출력 형식을 설정하는 데 사용됩니다.

String statusDate를 수락 한 다음 컨트롤러에서 Date 형식으로 변환하는 DTO 개체를 만드는 것이 좋습니다.

는 문자열 형식으로 날짜를 확인하려면, 당신은 @Pattern 사용할 수 있습니다

public class StatusDateDto { 

    @NotNull(message="Status date is a required field")  
    @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}", message="Invalid status date") 
    private String statusDate; 

    //Getter and setter 
} 

public ResponseEntity<?> postStatusDate(@Valid @RequestBody StatusDateDto dateDto, BindingResult result) { 

     if (result.hasFieldErrors()) { 
      String errors = result.getFieldErrors().stream() 
       .map(p -> p.getDefaultMessage()).collect(Collectors.joining("\n")); 

      return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors); 
     } 

     // Convert the String to Date after validation 

     return ResponseEntity.ok().build(); 
    }