#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) . И так далее.