2017-11-13 1 views
1

Ich erstelle einen E-Mail-Dienst mit Spring 4, wo der Benutzer mehrere Anhänge hochladen kann und die Eingaben von einer JSP-Seite kommen.@RequestParam konnte CommonsMultipartFile nicht finden attachFile []

die JSP-Seite:

<%@ page language="java" contentType="text/html; charset=UTF-8" 
     pageEncoding="UTF-8" %> 
<!DOCTYPE html > 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Spring MVC - Email</title> 
</head> 
<body> 
<h1>Spring MVC - Send e-mail with attachments</h1> 

<form method="post" action="/sendEmail2" enctype="multipart/form-data"> 
    Email To: 
    <input type="text" name="mailTo[]" size="65"/><br> 

    CC: 
    <input type="text" name="ccTo[]" size="65"/><br> 

    Subject: 
    <input type="text" name="subject" size="65"/><br> 

    Message: 
    <textarea cols="50" rows="10" name="message"></textarea><br> 

    From: 
    <input type="text" name="from" size="65"/><br> 

    Attach file: 
    <input type="file" name="attachFile[]" size="60"/><br> 

    <input type="submit" value="Send E-mail"/> 
</form> 
</body> 
</html> 

Der Controller:

@Controller 
public class myController2 { 

    @Autowired 
    ReportingService2 service2; 

    @RequestMapping(value = "/sendEmail2", method = RequestMethod.POST) 
public String sendEmail2(HttpServletRequest request, 
         @RequestParam CommonsMultipartFile attachFile[] 
) { 
    String emailTo[] = request.getParameterValues("mailTo[]"); 
    String ccTo[] = request.getParameterValues("ccTo[]"); 
    String subject = request.getParameter("subject"); 
    String msg = request.getParameter("message"); 
    fromName = request.getParameter("from"); 

    boolean res = service2.sendEmail(
      emailTo, ccTo, subject, msg, attachFile, 
      fromName, username, password, hostName, 
      encoding, protocol, portNo, TLS, 
      sendPartial, SMTPAuth, SSL 
    ); 


    if (res) { 
     return "/WEB-INF/Result"; 

    } else { 
     return "errorpage"; 
    } 
} 

Der Dienst für E-Mail:

@Service 
public class EmailService2 implements ReportingService2 { 

    @Override 
    public boolean sendEmail(String[] toEmailAddresses, String[] toCc, 
          String subject, String message, 
          CommonsMultipartFile[] attachFile, 
          String fromName, String userName, 
          String password, String hostName, 
          String encoding, String protocol, 
          String portNo, boolean TLS, boolean sendPartial, 
          boolean SMTPAuth, boolean SSL) { 

     Properties mailProperties = new Properties(); 

     if (SSL) { 
      // if SSL is used then port no should be 465 
      mailProperties.put("mail.smtp.ssl.enable", true); 
      mailProperties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
      mailProperties.put("mail.smtp.socketFactory.port", portNo); 
      mailProperties.put("mail.smtp.socketFactory.fallback", false); 

     } else if (TLS) { 
      //if TLS is used then port no should be 587 
      mailProperties.put("mail.smtp.starttls.enable", true); 
     } 

     if (SMTPAuth) { 
      mailProperties.put("mail.smtp.auth", true); 
     } 

     if (sendPartial) { 
      mailProperties.put("mail.smtp.sendpartial", true); 
     } 

     JavaMailSenderImpl javaMailSenderImpl = new JavaMailSenderImpl(); 
     javaMailSenderImpl.setJavaMailProperties(mailProperties); 

     //if no TLS and no SSL then default port no is 25 
     javaMailSenderImpl.setPort(Integer.parseInt(portNo)); 
     javaMailSenderImpl.setHost(hostName); 
     javaMailSenderImpl.setUsername(userName); 
     javaMailSenderImpl.setPassword(password); 
     javaMailSenderImpl.setDefaultEncoding(encoding); 

     javaMailSenderImpl.send(mimeMessage -> { 

      MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, encoding); 

      messageHelper.setSubject(subject); 
      messageHelper.setText(message); 
      messageHelper.setFrom(fromName); 

      if (toEmailAddresses != null) { 
       for (String singleEmailTo : toEmailAddresses) { 
        messageHelper.setTo(singleEmailTo); 
       } 
      } 

      if (toCc != null) { 
       for (String singleCc : toCc) { 
        messageHelper.setCc(singleCc); 
       } 
      } 

      if (attachFile != null) { 
       for (CommonsMultipartFile singleFile : attachFile) { 
        messageHelper.addAttachment(singleFile.getOriginalFilename(), singleFile); 
       } 
      } 
     }); 


     return true; 
    } 
} 

Jetzt, als ich habe ich den Dienst in der folgenden Art und Weise umgesetzt Führe das Projekt aus und triff das Mapping. Der Fehler, den ich bekomme, ist im Controller. Im Folgenden finden Sie die Fehlermeldung:

**HTTP Status 400 – Bad Request** 

**Type** Status Report 

**Message** Required CommonsMultipartFile[] parameter 'attachFile' is not present 

**Description** The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). 

Apache Tomcat/8.5.23 

Ich habe versucht, das Array von Anlagen in der folgenden Art und Weise zu erhalten, aber es sagt nicht kompatiblen Typ:

CommonsMultipartFile[] files=request.getParameterValues("attachFile[]"); 

Bitte helfen ...

+0

Wie Sie diese Zuordnung treffen. Mit einem Rest-Client wie Postboten oder anderen Code verwenden? – pvpkiran

+0

Ich treffe über meine JSP-Seite. Ich habe die obigen Implementierungscodes angegeben. – SAM

+1

In Ihrem Controller-Benutzer '@RequestParam (" attachFile ")' Und kann ich wissen, warum Sie CommonsMultipartFile verwenden. Sie können stattdessen MultipartFile verwenden. Auch ich denke in deinem Jsp sollte es so sein wie 'name =" attachFile "'. Ich weiß nicht, Jsp. Nur eine Schätzung – pvpkiran

Antwort

1

In Ihrem Controller-Verwendung

@RequestParam("attachFile") 

Wie die Fehlermeldung sagt, sucht Spring Framework nach einem Parameter mit dem Namen 'attachFile'

+0

@RequestParam ("attachFile []") ausgearbeitet, als ich ein Array von HTML schickte. – SAM