12

Sto tentando di impostare un oggetto dominio @Configurable (non gestito dal contenitore a molla).
L'ho ottenuto aggiungendo il -javaagent:path/to/spring-instrument.jar come argomento JVM, ma non è chiaro al 100% se questo -javaagent DEVE essere in posizione. Io corro questo su Tomcat 8. I può essere una cattiva interpretazione del documentation ma sembra io possa essere in grado di utilizzare un altro meccanismo per ottenere questo risultato, in particolare questa linea:Tomcat 8, Spring Boot, @ Load Time Load configurabile senza -javaagent?

non definiscono TomcatInstrumentableClassLoader più su Tomcat 8.0 e più alto. Invece, lascia che Spring utilizzi automaticamente la nuova funzionalità nativa InstrumentableClassLoader di Tomcat tramite la strategia TomcatLoadTimeWeaver.

esempi di codice qui sotto:

@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"); 
    } 
} 

Così, c'è un modo per ottenere questi oggetti @Configrable tessuti senza specificare il -javaagent? Sarei interessato all'apprendimento se riesco a ottenere ciò quando eseguo la distribuzione come WAR a un server Tomcat 8 autonomo e/o utilizzando il server Tomcat 8 incorporato quando si avvia come un contenitore "fat".

Allo stato attuale la distribuzione su Server standalone Tomcat 8 non genera un errore ma il metodo getMyService() restituisce null. Avvio in un barattolo di grasso getta il seguente errore durante l'avvio:

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

Suppongo che la vera domanda è come faccio Specify a custom LoadTimeWeaver in Tomcat 8? Nulla sembra accadere automaticamente come afferma la documentazione, ma di nuovo potrei interpretare male ciò che significa esattamente.

+1

Ho lo stesso problema in questo momento, l'hai risolto? – alexanoid

+0

@alexanoid sfortunatamente non l'ho fatto – mjj1409

risposta

-2

cosa ne pensi di creare la tua annotazione @MyConfigurable? così puoi fare ciò che vuoi quando vengono chiamati i metodi.

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 
{}