request 에서 URL 정보를 가져왔을때, url 에 있는값이 PathVariable 인지 알수가 없음.

 

그래서 URL 에서 pathVariable 변수명으로 치환하기 위한 로직. (이 URL 을 가져와서 URL 별 권한이 있는지 DB에서 조회하기 위해서 사용함)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    
/*
*  3. PathVariable 정보 Map 으로 가져오기
*/
Map<StringString> pathVariables = (Map<StringString>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
 
// URL 에서 PathVariable 부분을 replace
Iterator<String> itr = pathVariables.keySet().iterator();
String key = null;
String value = null;
String[] splitStr = url.split("/");
while (itr.hasNext()) {
    key = (Stringitr.next();
    value = pathVariables.get(key);
    for (int i = 0; i < splitStr.length; i++) {
        if (splitStr[i].equals(value)) {
            splitStr[i] = "{" + key + "}";            
            }
    }
    url = String.join("/"Arrays.asList(splitStr));

 

'Web개발 > Java' 카테고리의 다른 글

날짜 유효성 체크 어노테이션  (0) 2019.12.04
@SpringBootTest 와 @WebMvcTest 차이  (0) 2019.07.07

1. 커스텀 어노테이션 생성.

2. validate 부분 작성.

3. VO에 적용.

 

1.  커스텀 어노테이션 생성.

@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FromDateBeforeOrSameAsToDateValidator.class)
@Documented
public @interface FromDateBeforeOrSameAsToDate {
    String message() default "시작일은 종료일보다 클수 없습니다";

    Class[] groups() default {};

    Class[] payload() default {};

    String searchFromDt();

    String searchEndDt();

    @Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface List
    {
        FromDateBeforeOrSameAsToDate[] value();
    }
}

 

2. validate 작성.

public class FromDateBeforeOrSameAsToDateValidator implements ConstraintValidator<FromDateBeforeOrSameAsToDate, Object> {

    private String searchFromDt;
    private String searchEndDt;

    @Override
    public void initialize(FromDateBeforeOrSameAsToDate constraintAnnotation) {
        searchFromDt = constraintAnnotation.searchFromDt();
        searchEndDt = constraintAnnotation.searchEndDt();
    }

    @Override
    public boolean isValid(Object requestObject, ConstraintValidatorContext constraintValidatorContext) {
        Field fromDateField = FieldUtils.getField(requestObject.getClass(), searchFromDt, true);
        Field toDateField = FieldUtils.getField(requestObject.getClass(), searchEndDt, true);

        String fromLocalDate = (String) ReflectionUtils.getField(fromDateField, requestObject);
        String toLocalDate = (String) ReflectionUtils.getField(toDateField, requestObject);

        SimpleDateFormat transFormat = new SimpleDateFormat("yyyyMMdd");
        transFormat.setLenient(false); //유효한 날짜인지 체크 예를들어 2019/01/32 이런거 체크
        Date from = new Date();
        Date to = new Date();

        if (fromLocalDate == null || toLocalDate == null) {
            return true;
        }

        try {
             from = transFormat.parse(fromLocalDate);
             to = transFormat.parse(toLocalDate);
            if(from.compareTo(to) > 0){ // Date 1 occurs after Date 2
                return false;
            }
        } catch (ParseException e) {
            constraintValidatorContext.buildConstraintViolationWithTemplate("유효하지 않은 날짜 입니다.") .addConstraintViolation();
            return false;
        }

        constraintValidatorContext.disableDefaultConstraintViolation();
        constraintValidatorContext.buildConstraintViolationWithTemplate(
                "시작일은 종료일보다 클수 없습니다.")
                .addConstraintViolation();

        return fromLocalDate.equals(toLocalDate) ||  (from.compareTo(to) < 0);
    }
}

 

3. VO에 적용.

@FromDateBeforeOrSameAsToDate.List({ @FromDateBeforeOrSameAsToDate(searchFromDt = "regStartDate", searchEndDt = "regEndDate" })
public class EmployeeContractDelivery extends BaseObject {

        /*등록시작일자*/
        private String regStartDate;
        /*등록종료일자*/
        private String regEndDate;

 

        public String getRegStartDate() {
            return regStartDate;
        }  
        public void setRegStartDate(String regStartDate) {
            this.regStartDate = regStartDate;
        }
        public String getRegEndDate() {
            return regEndDate;
        }
        public void setRegEndDate(String regEndDate) {
            this.regEndDate = regEndDate;
        }

}

'Web개발 > Java' 카테고리의 다른 글

Url PathVariable 변수명 가져오기  (0) 2020.03.05
@SpringBootTest 와 @WebMvcTest 차이  (0) 2019.07.07

@WebMvcTest 는 컨트롤러 테스트할때 (아래와같이 간단한 controller테스트할때)

 

ex) mvc.perform(get"/xxxxx/zzzzz").accept(MediaType.APPLICATION_JSON))

.andExpect(status().isOk()

.print());

 

@SpringBoootTest 는 어플리케이션 컨텍스트 설정정보 등 모두 불러와 웹서버에 연결을 시도. (WebMvcTest 보다 많이 무겁겠죠?)

 

그럴땐 TestRestTemplate 를 사용. 다음에 TestRestTemplate 에 대해 마져 쓰기.

'Web개발 > Java' 카테고리의 다른 글

Url PathVariable 변수명 가져오기  (0) 2020.03.05
날짜 유효성 체크 어노테이션  (0) 2019.12.04

+ Recent posts