2017-02-22 2 views
0

Ich bin vor einer Anwendung MVC basierend auf Frühling 4.3.5Spring 4.3.5 kann ich Laufzeit-generierte Java-Klassen mit @ModelAttribute Annotation verwenden?

Wenn der Benutzer ein Formular sendet und der richtige Controller-Methode Anruf eingeht, zieht die @ModelAttribute Anmerkung das binded Objekt aus dem Modell. die Syntax der @ModelAttribute Anmerkung Da wird der Objekttyp in die Methodenparameter Definition angegeben, wie zum Beispiel

@ModelAttribute("command") Mail mail 
@ModelAttribute("command") News news 

usw.

Bei einigen funktionalen Gründen erstellt die Anwendung Java-Klassen on the fly von XML-Deskriptoren über Castor-Framework. Diese Klassen existieren zur Entwicklungszeit nicht, sondern existieren nur zur Laufzeit.

Ich kann keinen Weg finden, diese Runtime-generated-Klassen mit der @ModelAttribute Annotation zu verwenden! Im Moment sollte ich neue Controller-Methoden für jedes einzelne Objekt entwickeln.

Hat jemand eine Idee oder Vorschläge?

THX viel im Voraus

+0

Sie können keine Anmerkungen mit etwas Dynamischem verwenden - das ist eine Einschränkung von javac. Sie können sich stattdessen in das zugrunde liegende AOP-System einklinken, das diese Anmerkungen verwendet. – OrangeDog

+0

was meinst du? Kannst du mir bitte einen weiteren Vorschlag geben? – vale

Antwort

0

Ja, es ist möglich, eine Anfrage an ein dynamisch erzeugte Objekt zu binden, sofern er zu einer POJO Struktur haftet. Es gibt ein Beispiel (Nummer 2) in this blog post, das genau das gleiche Szenario behandelt.

Der Param-Typ für das Bindungsobjekt muss nicht statisch sein. Es kann so allgemein wie java.lang.Object sein.

z.B.

@Controller 
public class CommandController { 

    @ModelAttribute("command") 
    public Object getInitializeObject(HttpServletRequest request) { 
     //use your own logic to instantiate the object. 
     if(request.getParameter("requesttype").equals("mail")) { 
      return new Mail(); 
     } 
     else { 
      return new News(); 
     } 
    } 

    @RequestMapping(value="/myrequest.do", method=RequestMethod.GET) 
    public ModelAndView handleRequest(@ModelAttribute("command") Object command) { 
     //request handling logic here. 
    } 

} 
Verwandte Themen