horndinkle horndinkle - 2 months ago 15
Java Question

Spring - Providing @Autowired at runtime

I have a program that's being called as a web service, from another web service, actually. The caller of my program converts the input (which is the input to my program too) to JSON, and then calls my program, passing the JSON in. My program converts it (through GSON) to Java code. Keep in mind that the input is in a jar file that's included in my pom. Is there a way to autowire a part of the input?

What I've done so far is to put

@Component
on the part I want to autowire, called SystemInfo:

@Component
public class SystemInfo {
protected String GUID;
protected String EntityID;
protected Double EpisodeNumber;
protected Double ErrorCode;
protected String ErrorMesg;
protected String Facility;
protected String NamespaceName;
protected String OptionId;
protected String OptionStaffId;
protected String OptionUserId;
protected String ParentNamespace;
protected String ServerName;
protected String SystemCode;
protected String WarName;
protected String ScriptName;

/**
* @return the gUID
*/
public String getGUID() {
return GUID;
}
<other setters and getters>


I've set up an ApplicationConfig.java that consists of:

@Configuration
@ComponentScan(basePackages = "org.mhcd.avatar.model")
public class ApplicationConfig {

}


I put that in the jar so it would see the
@Component
. I put in the xml for my program:

<bean id="systemInfo"
class="org.mhcd.avatar.model.domainLayer.SystemInfo"
autowire="byType" autowire-candidate="true">
</bean>


Then, I put in my program:

@Autowired
private ApplicationContext context;


and

GenericApplicationContext ctx = new GenericApplicationContext(context);
ctx.refresh();


The refresh I put after I converted the JSON to Java objects. I put
@Autowired
in front of the SystemInfo in my DAO objects, and I stepped through my DAOs in debug, and SystemInfo is null. I'm thinking there must be a way to do this, but I don't know what it is.

Answer

I finally gave up and took out almost all the Spring annotations. I still have @RestController, some @Component, and a sprinkling of @Autowired and @Repository. I got around this issue by putting this in all my DAOs:

private SystemInfo systemInfo;
public void init(SystemInfo systemInfo) {
    this.systemInfo = systemInfo;
}

I then called the init method before doing any work, providing systemInfo as an argument.

There must be some way to do this as an @Autowired sort of thing, but I don't know what it is.