Spring Restemplate Описание ошибки обработки исключений null - результат равен 500 null - PullRequest
0 голосов
/ 20 сентября 2019

В настоящее время у меня есть приложение с загрузочной пружиной (версия - 2.1.8.RELEASE), которое предоставляет остальные веб-службы, которые предоставляют некоторые базовые функции электронной почты.Я добавил компонент swagger и могу тестировать веб-сервис через интерфейс интерфейса swagger.Например, когда я тестирую веб-сервис через пользовательский интерфейс Swagger и не вводю обязательные поля, такие как mailfrom, я получаю сообщение об ошибке, в котором говорится, что emailfrom отсутствует с кодом состояния, чего я и ожидаю.

Но когдатот же сценарий выполняется с проектом Spring mvc (клиент для веб-службы - версия Spring 3.2.5.RELEASE), при этом не отображается описание ошибки, так как я ожидал, что при тестировании с использованием пользовательского интерфейса Swagger будет происходить то же поведение.Пожалуйста, смотрите результат скриншота при выполнении интеграционного теста ниже: 500 null : enter image description here

Пожалуйста, найдите ниже контроллер покоя пружинного приложения ниже:

@RestController
@RequestMapping("/email")
public class EmailController {

    private static final Logger LOG = LoggerFactory.getLogger(EmailController.class);

    @Autowired
    SendMailService sendMailService;


    @ApiOperation(value = "This service send mail based on the information provided from EmailRequestDto", response = String.class)
    @PostMapping(value = "/sendMail")
    public @ResponseBody ResponseEntity<String> sendMail(@RequestBody EmailRequestDto emailRequestDto) {
        LOG.debug("calling method sendMail");

            sendMailService.sendEmail(emailRequestDto);

        return new ResponseEntity<>("Mail has been sent successfully", HttpStatus.OK);
    }

Ниже приведена часть класса обслуживания для отправки электронной почты:

@Component
public class SendMailServiceImpl implements SendMailService {

    private static final Logger LOG = LoggerFactory.getLogger(SendMailServiceImpl.class);

    @Autowired
    private JavaMailSender javaMailSender;

    /**
     * {@inheritDoc}
     */
    @Override
    public void sendEmail(EmailRequestDto emailRequestDto)  {

        LOG.debug("calling method sendMail");

        if (!ObjectUtils.isEmpty(emailRequestDto)) {


            MimeMessage msg = javaMailSender.createMimeMessage();
            // true = multipart message
            MimeMessageHelper helper;
            try {
                helper = new MimeMessageHelper(msg, true);
                  helper.setFrom(emailRequestDto.getMailFrom());
                    helper.setTo(emailRequestDto.getMailTo().stream().toArray(String[]::new));
                    helper.setSubject(emailRequestDto.getSubject());
                    helper.setText(emailRequestDto.getEmailContent(), true);
//                  helper.addAttachment("my_photo.png", new ClassPathResource("android.png"));




                    javaMailSender.send(msg);
            } catch (MessagingException e) {
                 throw new ResponseStatusException(
                          HttpStatus.NOT_FOUND, "Error occurred while send mail", e);
            }




        }

    }

Ниже приведен мой интеграционный тест для вызова веб-службы из проекта клиента:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:dummy-service-test-context.xml" })
public class SendMailServiceTest {

    @Test
    public void testService() {


        final String uri = "http://localhost:8080/email-service/email/sendMail";

        EmailRequestDto emailRequestDto = new EmailRequestDto();
//      emailRequestDto.setMailTo((Arrays.asList("dummy@gmail.com")));
//      emailRequestDto.setEmailContent("Dear Sir");
//      emailRequestDto.setMailFrom("dummy_38@hotmail.com");
//      emailRequestDto.setSubject("Sending Email subject");

        emailRequestDto.setMailTo(null);
        emailRequestDto.setEmailContent(null);
        emailRequestDto.setMailFrom(null);
        emailRequestDto.setSubject(null);

        HttpEntity<EmailRequestDto> request = new HttpEntity<>(emailRequestDto);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> es = restTemplate.exchange(uri, HttpMethod.POST, request,String.class);

//      ResponseEntity<?> response = restTemplate.postForEntity(uri, request, ResponseEntity.class, new HashMap());

        Assert.assertTrue(es.getStatusCode().equals(HttpStatus.OK));


    }

}

Пожалуйста, найдите мой адрес электронной почты ниже:

@Getter
@Setter
@ApiModel
public class EmailRequestDto implements Serializable {

    private static final long serialVersionUID = 1L;
    private List<String> mailTo;
@ApiModelProperty(value = "Email address who is sending the mail", required = true)
@NonNull
private String mailFrom;
@ApiModelProperty(value = "Subject of the  mail", required = true)
@NonNull
private String subject;
@ApiModelProperty(value = "The content of the mail", required = true)
@NonNull
private String emailContent;
private List<String> bcc;
@ApiModelProperty(value = "This attribute identify if the mail content should be sent as html or plain text", required = true)
@NonNull
boolean fileHtml;

Может кто-нибудь указать мне, что я делаю неправильно и почему я получаю 500 нулей, пожалуйста?

Когда я специально вставляю дату из нуля впринудительно завершить работу приложения в журнале весенней загрузки tomcat, исключение корректно:

mailFrom обязательно:

nested exception is com.fasterxml.jackson.databind.JsonMappingException: mailFrom is marked non-null but is null

Но в моем тесте интеграции клиента это:

org.springframework.web.client.HttpClientErrorException: 400 null
...