我正在@Configurable(autowire=Autowire.BY_TYPE)为给定的类使用基于注释的连接(即),并且我想将给定类型的所有bean作为列表连接到它中:
应用背景:
<beans>
<bean class="com.my.class.FirstConfigurer"/>
<bean class="com.my.class.SecondConfigurer"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
自动加入的课程:
@Configurable(autowire=Autowire.BY_TYPE) public class Target {
...
public void setConfigurers(List<Configurer> configurers) { ... }
}
Run Code Online (Sandbox Code Playgroud)
所有依赖项都实现一个名为的公共接口 Configurer
有没有办法让这个工作让一个类型的所有依赖关系在一个集合中连接在一起并在必要时注入,或者我应该<list>在XML中定义一个什么?
使用Spring 3.1.2,JUnit 4.10.0,这两个版本都很新.我遇到的问题是我无法使基于注释的自动装配工作.
下面是两个样本,一个没有使用注释,这是正常工作.而第二个使用注释,这是行不通的,我找不到原因.我几乎遵循了spring-mvc-test的样本.
工作:
package com.company.web.api;
// imports
public class ApiTests {
@Test
public void testApiGetUserById() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/com/company/web/api/ApiTests-context.xml");
UserManagementService userManagementService = (UserManagementService) ctx.getBean("userManagementService");
ApiUserManagementController apiUserManagementController = new ApiUserManagementController(userManagementService);
MockMvc mockMvc = standaloneSetup(apiUserManagementController).build();
// The actual test
mockMvc.perform(get("/api/user/0").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
}
}
Run Code Online (Sandbox Code Playgroud)
失败,因为userManagementService为空,没有获得自动连接:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration // should default to ApiTests-context.xml in same package
public class ApiTests {
@Autowired
UserManagementService userManagementService;
private MockMvc mockMvc;
@Before
public void setup(){
// SetUp never gets called?! …Run Code Online (Sandbox Code Playgroud) 我有一个Spring bean,在Spring Bean中我依赖于其他bean的列表.我的问题是:如何将bean的通用列表注入该bean的依赖项?
例如,一些代码:
public interface Color { }
public class Red implements Color { }
public class Blue implements Color { }
Run Code Online (Sandbox Code Playgroud)
我的豆子:
public class Painter {
private List<Color> colors;
@Resource
public void setColors(List<Color> colors) {
this.colors = colors;
}
}
@Configuration
public class MyConfiguration {
@Bean
public Red red() {
return new Red();
}
@Bean
public Blue blue() {
return new Blue();
}
@Bean
public Painter painter() {
return new Painter();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是; 如何获取Painter中的颜色列表?另外,在旁注:我应该让@Configuration返回接口类型,还是类?
谢谢您的帮助!
我有这个控制器方法的Spring MVC应用程序.
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String addNumber(@RequestParam(value="number", required=false) Long number) {
...
return "redirect:/showAll/";
}
Run Code Online (Sandbox Code Playgroud)
在我的JSP中,我有一个标准的HTML表单,它将一个名为"number"的值发布到上面的控制器方法中.但是,如果我省略了值(不在文本字段中输入任何内容)并将数据POST到控制器,则在调用控制器方法之前,我的浏览器显示
HTTP Status 400 - Required Long parameter 'number' is not present
Run Code Online (Sandbox Code Playgroud)
尽管控制器方法注解明确规定-parameter为"数字" 不必需的.
有没有人对可能发生的事情略有了解?
谢谢.
PS:抛出的异常如下:
org.springframework.web.bind.MissingServletRequestParameterException: Required Long parameter 'number' is not present
Run Code Online (Sandbox Code Playgroud)
编辑:这是一个Spring 3.2.3.RELEASE错误(见这里).使用版本3.1.4.RELEASE我不再有这个问题了.
我有一个配置了spring boot和config注释的spring应用程序.
JPA配置是:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
public class JpaConfiguration {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.DERBY).build();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource,
JpaVendorAdapter jpaVendorAdapter) {
LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
lef.setDataSource(dataSource);
lef.setJpaVendorAdapter(jpaVendorAdapter);
lef.setPackagesToScan( /* "..." */ );
return lef;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
hibernateJpaVendorAdapter.setShowSql(true);
hibernateJpaVendorAdapter.setGenerateDdl(true);
hibernateJpaVendorAdapter.setDatabase(Database.DERBY);
return hibernateJpaVendorAdapter;
}
@Bean
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager();
}
}
Run Code Online (Sandbox Code Playgroud)
我一直在日志中:
[...]
HHH000400: Using dialect: org.hibernate.dialect.DerbyDialect
HHH000430: The DerbyDialect dialect has been …Run Code Online (Sandbox Code Playgroud) 我有一个用作春豆的课程.bean的定义applicationContext.xml如下:
<bean id="myClass" class="com.example.MyClass">
<property name="cssFiles" value="classpath*:../../cssDir/*.css"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
而且MyClass样子:
...
import org.springframework.core.io.Resource;
...
public class MyClass {
private List<Resource> cssFiles;
// methods etc.
}
Run Code Online (Sandbox Code Playgroud)
所以Spring用"classpath*:../../ cssDir /"下的所有扩展名为.css的文件填充cssFiles字段.
现在我正在努力转向完整的注释配置,但我无法用注释做同样的事情.这不起作用:
...
import org.springframework.core.io.Resource;
...
@Component
public class MyClass {
@Value("classpath*:../../cssDir/*.css")
private List<Resource> cssFiles;
// methods etc.
}
Run Code Online (Sandbox Code Playgroud)
你有什么主意吗?
java spring dependency-injection spring-annotations spring-io
我的应用程序从环境变量获取属性文件的位置,它可能不在WEB-INF文件夹中.我找不到文件,但这个文件肯定存在.我不想使用classpath:前缀,我不希望它相对于应用程序根目录.
@PropertySource("${propfile}")
public class ... {
Run Code Online (Sandbox Code Playgroud) 我使用spring组件扫描来自动检测bean:
@ComponentScan({"com.org.x, com.org.y"})
Run Code Online (Sandbox Code Playgroud)
问题是我想要com.org.x扫描所有类,但我想要一个单独的类com.org.y.SomeService.class,单独扫描com.org.y
我怎样才能做到这一点?
除了使用上下文扫描之外,我如何创建这个bean并注入应用程序上下文?
以下是一个最小的示例,显示了我的问题。
Main.kt:
package com.mycompany.configurationpropertiestest
import org.slf4j.LoggerFactory
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.ConstructorBinding
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.runApplication
import org.springframework.scheduling.annotation.EnableScheduling
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Service
@SpringBootApplication
@EnableScheduling
@EnableConfigurationProperties(FooServiceConfig::class)
class Application
fun main(args: Array<String>) {
runApplication<Application>(*args)
}
@ConstructorBinding
@ConfigurationProperties("configurationpropertiestest.foo")
data class FooServiceConfig(
val interval: Int = 1000,
val message: String = "hi"
)
@Service
class FooService(
private val myConfig: FooServiceConfig
) {
private val log = LoggerFactory.getLogger(this.javaClass)
//@Scheduled(fixedDelayString = "#{@FooServiceConfig.interval}")
//@Scheduled(fixedDelayString = "#{@myConfig.interval}")
@Scheduled(fixedDelayString = "\${configurationpropertiestest.foo.interval}")
fun talk() {
log.info(myConfig.message)
}
}
Run Code Online (Sandbox Code Playgroud)
( …
将 Spring Data JPA 与 Hibernate 一起使用,这两个注释可以互换吗?
更具体地说,Spring 注释是否可以替换 Hibernate 注释,以避免实体中任何直接的 Hibernate 依赖?如果不是,是否有任何理由在同一实体上使用两个注释?
hibernate immutability spring-annotations spring-data spring-data-jpa
spring ×9
java ×4
hibernate ×2
spring-boot ×2
derby ×1
immutability ×1
jpa ×1
junit ×1
junit4 ×1
kotlin ×1
spring-data ×1
spring-el ×1
spring-io ×1
spring-mvc ×1