Шаблон.Сбой регулярного выражения проверки списка

#java #regex #rest #spring-mvc

#java #регулярное выражение #отдых #spring-mvc

Вопрос:

Я застрял в следующей проблеме: ранее у меня было одно регулярное выражение для проверки MSISDN, и оно выглядело так: (380)[0-9]{9}. Это сработало как шарм, но пришел запрос на изменение, и мне пришлось разделить его на две части — первую, чтобы проверить, начинается ли строка с 380, а вторую, чтобы проверить, содержит ли она только цифры и содержит ли 12 символов. По какой-то причине он не работает и завершается с ошибкой во время тестирования на полностью допустимом MSISDN: 380671112233. Я пробовал использовать что-то вроде регулярного выражения, которое проверяет стратификацию символов ^, но все мои эксперименты провалились. Кто-нибудь может подсказать, что я делаю не так? Заранее спасибо!

 @Slf4j
@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping(InfoController.INFO_ENDPOINT )
public class InfoController {

public static final String INFO_ENDPOINT = "/info";
private final InfoService service;

@GetMapping(value = "/{msisdn}")
@ResponseBody
public InfoResponse getInfo(
        @Pattern.List({
                @Pattern(regexp = "(380)", message = "MSISDN_INCORRECT"),
                @Pattern(regexp = "[0-9]{12}", message = "MSISDN_OUT_OF_RANGE")
        })
        @PathVariable("msisdn") String msisdn,
        @RequestParam("cid") String cid) {
    log.info("[{}] get information for msisdn {}", cid, msisdn);
    InfoResponse response = service.getInfo(msisdn, cid);
    log.info("[{}] successful response for msisdn {} - {}", cid, msisdn, response);
    return response;
}

}
  

Моя тестовая настройка

 private static final String CID = "123-aaa-bbb-312";
public static final String MSISDN = "380671122333";
public static final String NAME = "PP AA";
public static final long ID = 476561L;
public static final int DISTANCE = 69;

@Autowired
private MockMvc mockMvc;
@MockBean
private InfoService service;

@Test
@DisplayName("Valid request. Expected: valid response")
public void testController1() throws Exception {
    InfoResponse response = new InfoResponse(MSISDN, NAME, ID, DISTANCE);
    when(service.getInfo(any(), any())).thenReturn(response);
    String request = UriComponentsBuilder
            .fromPath(InfoController.INFO_ENDPOINT)
            .pathSegment(MSISDN)
            .queryParam("cid", CID)
            .build().toString();
    mockMvc.perform(get(request))
            .andDo(print())
            .andExpect(content().json(
                    "{"param1":""   MSISDN   """  
                            ","param2":""   NAME   """  
                            ","param3":"   ID  
                            ","param4":"   DISTANCE   "}"
            ))
            .andExpect(status().isOk());
}
  

Комментарии:

1. Попробуйте @Pattern(regexp = "380[0-9]*", message = "MSISDN_INCORRECT"), @Pattern(regexp = "[0-9]{12}", message = "MSISDN_OUT_OF_RANGE")

2. нет, не сработало. Тем не менее, спасибо.

3. Попробуйте шаг за шагом. Создайте еще один простой тест, затем сопоставьте строку с первым регулярным выражением, а затем со вторым. Попробуйте разные регулярные выражения отдельно в этом простом тесте. Например, 380.* вместо (380) . И так далее.