当前位置: 首页 > 面试题库 >

Spring通用道类名称

戈曾琪
2023-03-14
问题内容

我已经为我的spring / hibernate项目配置了一个自定义的通用服务DAO-这个想法是我可以从控制器中轻松地重用它。

基本上看起来像这样:

public class DefaultService<T> {

private Class<T> e;

public String className(Class<T> e) {
    String clip = e.getName();
    clip = clip.substring(clip.lastIndexOf('.') + 1, clip.length());
    return clip;
}
public List<T> getAll(Integer status) {
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery("FROM " + className(e) + " WHERE status = " + status);
    return query.list();
}
...

被哪个引用:

@Autowired
public DefaultService<Address> addressService;
addressService.get(1);

但是,该String clip = e.getName()行抛出Null指针异常。如果将类移到attributes部分中,addressService.get(Address.class, 1)我可以使它起作用(因此,但我发现这有点不整洁,尤其是在调用多个不同的类时。

有什么方法可以让类正确地生成一个值,而无需将其重复添加到我的所有函数中?

提前致谢。


问题答案:

我做了类似的事情,您也需​​要将通用类也用作构造函数参数,我的也使用休眠实体,但是您可以传入表名的字符串。

public class DomainRepository<T> {

    @Resource(name = "sessionFactory")
    protected SessionFactory sessionFactory;

 public DomainRepository(Class genericType) {
        this.genericType = genericType;
    }

 @Transactional(readOnly = true)
    public T get(final long id) {
        return (T) sessionFactory.getCurrentSession().get(genericType, id);
    }

然后,您可以子类化(如果需要)以自定义或简单地在spring配置中设置bean,如t所示:

<bean id="tagRepository" class="com.yourcompnay.data.DomainRepository">
        <constructor-arg value="com.yourcompnay.domain.Tag"/>
</bean>

因此,在您的代码中,您可以像这样引用tagRepository(除了上面和下面发布的代码之外,不需要其他编码):

@Resource(name = "tagRepository")
private DomainRepository<Tag> tagRepository;

另外,我将其称为存储库而不是服务,服务处理不同的类型及其交互(而不仅仅是一个)。特别是使用SQL字符串的示例

public final String tableName;
public DomainRepository(String tableName) {
      this.tableName = tableName;
}
public List<T> getAll(Integer status) {
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery("FROM " + tableName + " WHERE status = " + status);
    return query.list();
}

并像这样定义您的豆子

<bean id="addressRepository" class="com.yourcompnay.data.DomainRepository">
  <constructor-arg value="address"/>
</bean>

然后,您还可以根据需要自己创建子类:

public class PersonRepository extends DomainRepository<Person> {
    public PersonRepository(){
        super("person"); //assumes table name is person
    }


 类似资料:
  • 问题内容: 使用泛型时,我在Java中有一个小问题。我有一堂课: 在方法中,我需要获取类型名称。有没有办法找到字符串使用? (如果创建了,我希望能够做到这一点- 我必须使用通用性,因为我的方法之一必须返回)。 这似乎很容易,但是我不知道如何去做。 问题答案: 由于 类型擦除, 您通常无法执行此操作-的实例不 知道 的类型。如果需要,一种方法是使用类型文字: 然后: 这很丑陋,但这就是类型擦除的作用

  • 我开始开发一个spring cloud stream项目。我已通过@Streamlistener注释成功接收到来自Kafka的消息。在将消息发送到任何输出通道之前,我必须通过调用externalservice或DB调用来转换有效负载。我不想从同一个streamlistener方法调用外部服务或DB方法。我的问题是,我们能否在Spring云流中创建内部通道(如Spring集成DSL流)?

  • 我正在使用Spring Cloud Stream,希望以编程方式创建和绑定通道。我的用例是,在应用程序启动期间,我收到要订阅的Kafka主题的动态列表。然后如何为每个主题创建频道?

  • 我在我们的项目中引入了spring集成,而不是遗留集成架构。该体系结构支持发送者和累犯。每个发件人可以配置3个目的地。 null Spring integration gateways看起来很合适。我可以使用default-request-channel来表示主流,error-channel来表示失败流。备份流的问题。如何复制网关传入消息并将其放置到备份通道? 更准确地说,这里是一个测试和代码。

  • 我正在尝试建立一个绑定,将Kafka消息从Spring Integration errorChannel转发到一个自定义通道(用于集中错误处理)。 错误消息被发送到配置的通道,但它们是以的形式到达的,负载为byte[](包含异常详细信息和失败消息)。 我的配置: 阅读文档时,我希望消息以的形式到达。我有什么办法可以做到这一点吗?还是将有效负载配置为作为对象到达? 我正在使用的版本: Spring

  • 我需要在我的Spring集成上下文中动态地将消息分配给MessageChannel。当我知道我想要的MessageChannel的名称时,我可以通过从上下文中获取MessageChannel bean来做到这一点。 我需要做的是通过编程查找在ChannelAdapter/服务中设置的消息通道的名称/id。 但是,MessageChannel API没有与之关联的getName()或getId()方