我已经为我的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()方