12

J'essaie de configurer un objet domaine @Configurable (non géré par le conteneur de ressort).
J'ai ceci fonctionnant en ajoutant le -javaagent:path/to/spring-instrument.jar comme argument de JVM mais ce n'est pas 100% clair pour moi si oui-javaagent DOIT être en place. Je suis en cela sur Tomcat 8. Je peux être mal interpréter les documentation, mais il semble que je peux être en mesure d'utiliser un autre mécanisme pour ce faire, dans cette ligne particulière:Tomcat 8, Spring Boot, @Configurable LoadTimeWeaving sans -javaagent?

Ne pas définir TomcatInstrumentableClassLoader plus sur Tomcat 8.0 et plus haute. Au lieu de cela, laissez Spring utiliser automatiquement la nouvelle fonctionnalité natif InstrumentableClassLoader de Tomcat via la stratégie TomcatLoadTimeWeaver.

Exemples de code ci-dessous:

@SpringBootApplication 
@EnableLoadTimeWeaving 
public class TestApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(TestApplication.class, args); 
    } 
    @Bean 
    public MyService myService(){ 
     return new MyService(); 
    } 
} 

@Configurable 
public class MyDomainObject { 

    @Autowired 
    private MyService myService; 

    public MyService getMyService(){ 
     return myService; 
    } 
} 

public class MyService { 
    private static final Logger log = LoggerFactory.getLogger(MyService.class); 

    public void test(){ 
     log.info("test"); 
    } 
} 

Ainsi est-il un moyen d'obtenir ces objets @Configrable tissés sans préciser le -javaagent? Je serais intéressé d'apprendre si je peux accomplir cela lors du déploiement en tant que WAR sur un serveur Tomcat 8 autonome et/ou en utilisant le serveur Tomcat 8 intégré lors du lancement en tant que gros pot. En l'état, le déploiement sur le serveur Tomcat 8 autonome ne génère pas d'erreur mais la méthode getMyService() ci-dessus renvoie null. Lancement comme un pot de graisse jette l'erreur suivante lors du démarrage:

Caused by: java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar

Je suppose que la vraie question est comment puis-je Specify a custom LoadTimeWeaver dans Tomcat 8? Rien ne semble se passer automatiquement comme le dit la documentation, mais encore une fois, je peux mal interpréter ce que cela signifie exactement. Qu'en est-il de la création de votre propre annotation @MyConfigurable?

+1

J'ai le même problème en ce moment, l'avez-vous résolu? – alexanoid

+0

@alexanoid malheureusement je n'ai pas – mjj1409

Répondre

-2

Ainsi, vous pouvez faire ce que vous voulez quand les méthodes sont appelées.

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Target(ElementType.CONSTRUCTOR) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface MyConfigurable 
{}