小编Nic*_*las的帖子

Spring Data:注入2个具有相同名称但在2个不同包中的存储库

上下文

我想在同一个Spring上下文中使用两个不同的数据库,这些数据库具有共享相同名称但不是相同结构的实体.我依赖Spring Data MongoDB和JPA/JDBC.我有两个包,其中包含以下文件:

  • COM. .entity
    • Car.class
  • COM.bar .repository
    • CarRepository.class
    • RepoBarMarker.class
  • COM. .config
    • MongoConfiguration.class
  • COM.foo .entity
    • Car.class
  • COM.foo .repository
    • CarRepository.class
    • RepoFooMarker.class
  • COM.foo .config
    • JPAConfiguration.class
    • SpecEntityManagerFactory.class

每个Car.class的内容都不同,我不能重复使用它们.bar使用Spring-Mongo,foo使用Spring-JPA,并通过@EnableMongoRepositories和@EnableJpaRepositories注释初始化存储库.在我的一个应用程序组件中,我尝试访问存储库的foo版本:

@Resource
private com.foo.repository.CarRepository carRepository;
Run Code Online (Sandbox Code Playgroud)

创建包含@Resource字段的类时,我有以下异常:

Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'carRepository' must be of type [com.foo.repository.CarRepository], but was actually of type [com.sun.proxy.$Proxy31]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:374)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:446)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:420)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:545)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:155)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:305)
    ... 26 more
Run Code Online (Sandbox Code Playgroud)

看来Spring尝试将 …

spring spring-data spring-data-jpa spring-data-mongodb

7
推荐指数
1
解决办法
3185
查看次数

在没有HTTP请求/ servlet的情况下使用@RequestMapping功能(Java方法映射的URL)

我正在尝试构建一个简单的PoC来替换当前依赖于主Java(Spring MVC 4.2)Web应用程序中加载的JAR文件的应用程序,以在启动时声明其他控制器.它看起来非常像:

Client <--HTTP--> Gateway+app (Spring MVC + order.jar)

Exposed endpoints:
/ping via controller in core Spring app
/orderApp/doSomething via controller in order.jar
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望将每个JAR文件作为独立的Spring Boot应用程序,使用Spring Integration 4.2(通过AMQP)与面向外部世界的HTTP网关交换数据.一点架构:

Client <--HTTP--> Gateway (Spring MVC) <--AMQP--> Standalone orderApp (Spring Boot)

Exposed endpoints:
/ping via controller in core Spring MVC app
/{appName}/** via controller in core Spring MVC app
Run Code Online (Sandbox Code Playgroud)

我在MVC应用程序的控制器中有逻辑,找到哪个AMQP交换机应该接收基于的消息appName,我使用网关串行化HTTP请求,将其发送到正确的应用程序,可以处理它,将回答发送回主要Spring应用程序将响应转发给客户端.这里没问题.

但是,我希望尽可能重用@RequestMapping我目前在JAR文件中使用的方便注释.这些JAR基本上包含额外的控制器,在给定的根下暴露端点.

@RequestMapping如果输入URL,请求正文和标题,如何手动触发逻辑?例如,假设我有一个类似的实现:

@RequestMapping("projects/{projectId}")
public Project projectById(@PathVariable final String projectId) {

    (...)
    return project;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法从我的独立应用程序中的某个地方的自定义服务代码我可以做一个调用handler.getResponse("projects/123abc", requestBody, …

java spring spring-mvc spring-integration

6
推荐指数
1
解决办法
815
查看次数

Spring集成:如何在聚合器之后处理服务中的异常?

我有一个依赖于Spring Integration(4.0.4.RELEASE)和RabbitMQ的应用程序.我的流程如下:

消息通过进程放入队列(他们不期望任何答案):网关 - >频道 - > RabbitMQ

然后由另一个过程排干:

RabbitMQ --1--> inbound-channel-adapter A --2--> chain B --3--> aggregator C --4--> service-activator D --5--> final service-activator E

解释和背景

具体的是,无处在我的应用我使用分离器:汇聚器C只是等待足够的信息来,或者超时到期,然后转发一批服务d.消息可能会在聚合器C中停留很长时间,并且不应被视为在那里消耗.只有在服务D成功完成后才能使用它们.因此,我在入站通道适配器A上使用MANUAL确认,服务E负责确认批次.

自定义聚合器

通过重新定义聚合器,我解决了设置为AUTO时的确认问题.实际上,如果流中发生任何异步过程,则会立即确认消息(请参阅此处的问题).因此,我切换到MANUAL确认并实现了这样的聚合器:

     <bean class="org.springframework.integration.config.ConsumerEndpointFactoryBean">
        <property name="inputChannel" ref="channel3"/>
        <property name="handler">
            <bean class="org.springframework.integration.aggregator.AggregatingMessageHandler">
                <constructor-arg name="processor">
                    <bean class="com.test.AMQPAggregator"/>
                </constructor-arg>
                <property name="correlationStrategy">
                    <bean class="com.test.AggregatorDefaultCorrelationStrategy" />
                </property>
                <property name="releaseStrategy">
                    <bean class="com.test.AggregatorMongoReleaseStrategy" />
                </property>
                <property name="messageStore" ref="messageStoreBean"/>
                <property name="expireGroupsUponCompletion" value="true"/>
                <property name="sendPartialResultOnExpiry" value="true"/>
                <property …
Run Code Online (Sandbox Code Playgroud)

amqp spring-integration

5
推荐指数
1
解决办法
1548
查看次数