Boa noite!
Eu estou tentando utilizar o padrão Strategy para definir alguns comportamentos.
Então eu tenho a interface e suas implementações:
public interface MasterfileDefinition {
public MasterfileType getType();
public void setDependencies();
}
@Component
public class CustomerDefinition implements MasterfileDefinition {
private Result result;
private CompanyTypeDAO companyTypeDAO;
public CustomerDefinition(Result result, CompanyTypeDAO companyTypeDAO) {
this.result = result;
this.companyTypeDAO = companyTypeDAO;
}
@Override
public MasterfileType getType() {
return MasterfileType.CUSTOMER;
}
@Override
public void setDependencies() {
result.include("companyTypes", companyTypeDAO.list());
}
}
@Component
public class CarrierDefinition implements MasterfileDefinition {
@Override
public MasterfileType getType() {
return MasterfileType.CARRIER;
}
@Override
public void setDependencies() {
}
}
Eu os anotei com @Component pois o valor que decide qual definition deverá ser usado vem de um converter e ele usa a interface Container para instanciar a classe filha, assim:
@Convert(MasterfileDefinition.class)
public class MasterfileDefinitionConverter implements
Converter<MasterfileDefinition> {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private Container container;
public MasterfileDefinitionConverter(Container container) {
this.container = container;
}
@Override
public MasterfileDefinition convert(String value,
Class<? extends MasterfileDefinition> type, ResourceBundle bundle) {
try {
if (!notEmpty(value))
throw new IllegalArgumentException(
"Unable to define query operation.");
String classPackage = "hamburgsud.frontend.masterfile.strategy.implementation.";
String className = value + "Definition";
logger.debug("MasterfileDefinition: " + className);
return (MasterfileDefinition) container.instanceFor(Class
.forName(classPackage + className));
} catch (IllegalArgumentException e) {
logger.error(
"Unable to instantiate this masterfile definition, will return null.",
e);
} catch (ClassNotFoundException e) {
logger.error(
"This masterfile definition could not be found, will return null.",
e);
}
return null;
}
}
E eu estou usando assim:
@Get("/masterfile/{definition}/form/{obj}")
public void form(MasterfileDefinition definition, Masterfile obj) {
definition.setDependencies();
result.include("type", definition.getType());
result.include("obj", obj);
}
O problema é que quando eu chamo essa action, ele não passa pelo meu converter e sempre instancia CarrierDefinition. :?
Existe alguma forma de forçar o VRaptor a chamar o converter?