Java 如何在Spring中获取@Component的实例?
我有一个名为RegistrationValidator的@Container类,它依赖于spring@存储库。通过自动连接在服务或其他容器中获取它的实例是可以的,但我需要在常规POJO中访问它。如何在不将所有POJO转换为@Container或@Service对象的情况下获取该验证器的实例。是否有一种方法可以在RegistrationValidator中添加一个返回实例的静态getInstance方法Java 如何在Spring中获取@Component的实例?,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个名为RegistrationValidator的@Container类,它依赖于spring@存储库。通过自动连接在服务或其他容器中获取它的实例是可以的,但我需要在常规POJO中访问它。如何在不将所有POJO转换为@Container或@Service对象的情况下获取该验证器的实例。是否有一种方法可以在RegistrationValidator中添加一个返回实例的静态getInstance方法 package core.dao.validator; import core.dao.Re
package core.dao.validator;
import core.dao.Registration;
import core.repository.RegistrationRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
/**
* Validates the Registration DAO.
*
* @author Srini Katragadda
*/
@Component
public class RegistrationValidator implements Validator {
private static final Logger LOGGER = LoggerFactory.getLogger(RegistrationValidator.class);
private static final int MAX_SIZE = 255;
private final RegistrationRepository repository;
@Autowired
RegistrationValidator(RegistrationRepository repository) {
this.repository = repository;
}
@Override
public boolean supports(Class clazz) {
return Registration.class.equals(clazz);
}
@Override
public void validate(Object obj, Errors errors) {
Registration registration = (Registration) obj;
// Validate Message Id
ValidationUtils.rejectIfEmpty(errors, "messageId", "messageId.empty");
if (registration.getMessageId() != null &&
registration.getMessageId().length() > MAX_SIZE)
errors.rejectValue("messageId", "Size greater than " + MAX_SIZE);
// Validate for duplicate messageId information
if (hasDuplicateMessageIdInDatabase(registration)) {
errors.rejectValue("callouts", "Database has duplicate registration with messageId.");
}
}
/**
* Check if there is duplicate messageId in database.
*/
private boolean hasDuplicateMessageIdInDatabase(Registration adsRegistration) {
return (repository.findByMessageId(adsRegistration.getMessageId()) != null);
}
}
这里我需要一个验证器的实例。签出Builder.build()方法,该方法将验证器实例传递给实用程序方法。在我需要在RegistrationValidator中自动连接@Repository之前,这一切都很好。现在,我需要传递repository的实例,以便能够构造验证器,我想知道如何在不使DAO本身成为另一个组件并将其与RegistrationValidator自动连接的情况下
package core.dao;
import core.dao.validator.RegistrationValidator;
import core.util.ValidatorUtil;
import core.util.ToString;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
/**
* The data access object that holds the information of an Registration.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public final class Registration {
private String id;
private String messageId;
private String version;
public Registration() {
}
private Registration(Builder builder) {
this.id = builder.id;
this.messageId = builder.messageId;
this.version = builder.version;
}
public static Builder getBuilder() {
return new Builder();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMessageId() {
return messageId;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
/**
* Builder pattern makes the object easier to construct in one line.
*/
public static class Builder {
private String id;
private String messageId;
private String version;
private Builder() {}
public Builder id(String id) {
this.id = id;
return this;
}
public Builder messageId(String messageId) {
this.messageId = messageId;
return this;
}
public Builder version(String version) {
this.version = version;
return this;
}
public Registration build() {
Registration entry = new Registration(this);
return (Registration) ValidatorUtil.validate(entry, new RegistrationValidator());
}
}
}
下面是ValidatorUtil.validate代码的完整性
public static Object validate(Object entry, org.springframework.validation.Validator customValidator) {
Errors errors = new BeanPropertyBindingResult(entry, entry.getClass().getName());
customValidator.validate(entry, errors);
if (errors == null || errors.getAllErrors().isEmpty())
return entry;
else {
LOGGER.error(errors.toString());
throw new InvalidDataException(errors.getAllErrors().toString(), errors);
}
}
您可以使用SpringBeanAuthoringSupport将SpringBean自动连接到pojo中,方法如下:
public class Pojo {
@Autowired
private RegistrationRepository repository
public void methodWhichRequiresBean() {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
repository.doStuff()
}
希望这有帮助为什么要在POJO中使用它的实例?你能展示用例吗?可能是可以移动到服务类的。更新了问题并提供了更多信息。请看一看。谢谢。理想情况下,我不会让
validate()
方法与DB对话以验证重复项。它应该只验证对象的状态(无论它是否处于有效状态)。就这样。在那之后,服务层的工作是验证完全构造和验证的对象是否重复。是的,可能这就是我要做的,以保持它干净。在一个地方进行所有验证有一定的优点,但不会以污染代码为代价。感谢您的帮助。repository.doStuff()将返回NullPointerException,因此存储库未初始化。Pojo可能是在spring初始化此bean之前创建的吗?在这个问题上,我遇到了类似的问题:我的问题是,我在构造函数中使用了SpringBeanAuthoringSupport,而bean仍然没有创建。我的POJO是在注入另一个Spring服务的Spring管理工厂中创建的——无论如何,问题在于POJO/bean的创建时间。