本文将为您提供关于java–Spring数据存储库的字段字段查找方法的详细介绍,我们还将为您解释spring查询数据库的相关知识,同时,我们还将为您提供关于Jackson与SpringBoot的实现:
本文将为您提供关于java – Spring数据存储库的字段字段查找方法的详细介绍,我们还将为您解释spring查询数据库的相关知识,同时,我们还将为您提供关于Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射、Java SE + Spring数据+休眠、java – Spring Roo更新密码字段或不更新所有字段、java – spring-data-cassandra存储库的多个密钥空间支持?的实用信息。
本文目录一览:- java – Spring数据存储库的字段字段查找方法(spring查询数据库)
- Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射
- Java SE + Spring数据+休眠
- java – Spring Roo更新密码字段或不更新所有字段
- java – spring-data-cassandra存储库的多个密钥空间支持?
java – Spring数据存储库的字段字段查找方法(spring查询数据库)
我有两个实体,一个用户和一个注册用户.
注册用户具有user类型的字段.我想在Spring注册用户实体的数据存储库中有一个方法,通过连接到注册用户的用户的用户名搜索所有注册用户.
因此,这是具有关联用户字段的注册用户实体:
@Entity
public class RegisteredUser implements Serializable {
...
@OnetoOne
@JoinColumn(name = "USERNAME_FK")
private User user;
...
}
这是一个用户名:
@Entity
public class User implements Serializable {
...
@Id
@Column(nullable = false)
protected String username;
...
}
public interface RegisteredUserRepository extends CrudRepository
如果找不到整个字段名称,还有一些代码将大写字符作为字段分隔符处理.因此,如果您在RegisteredUser中没有userUsername字段,则第二个varian是
public interface RegisteredUserRepository extends CrudRepository
Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射
如何解决Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射?
我有一个要求,在如下不同的情况下抛出不同的错误,并且有很多这样的字段,而不仅仅是 1。
例如
-
{ "id": 1,"name": "nameWithSpecialChar$" }
这里应该为特殊字符抛出错误。
-
{ "id": 1,"name": null }
这里抛出字段空错误。
-
{ "id": 1 }
这里抛出字段缺失错误。
处理,第 1 和第 2 种情况很容易,但对于第 3 种情况,有什么方法可以让我们在使用 Jackson 进行序列化时在输入 json 中传递的字段名称列表?
一种方法,我可以通过将请求映射到 JsonNode 来实现,然后检查节点是否存在所需字段,然后手动反序列化该 JsonNode,然后验证其余成员,如下所示。
public ResponseEntity myGetRequest(@RequestBody JsonNode requestJsonNode) {
if(!requestJsonNode.has("name")){
throw some error;
}
MyRequest request = ObjectMapper.convertValue(requestJsonNode,MyRequest .class);
validateIfFieldsAreInvalid(request);
但是我不喜欢这种方法,有没有其他方法可以做到?
解决方法
您可以定义一个 JSON schema 并根据它验证您的对象。在您的示例中,您的架构可能如下所示:
{
"$schema": "https://json-schema.org/draft/2020-12/schema","type": "object","properties": {
"id": {
"description": "The identifier","type": "integer"
},"name": {
"description": "The item name","type": "string","pattern": "^[a-zA-Z]*$"
}
},"required": [ "id","name" ]
}
要验证您的对象,您可以使用 json-schema-validator 库。这个库建立在杰克逊之上。由于您无论如何都在使用 Spring Boot,因此您已经导入了 Jackson。
示例代码大致如下:
String schema = "<define your schema here>";
String data = "<put your data here>";
JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
ObjectMapper m = new ObjectMapper();
JsonSchema jsonSchema = factory.getJsonSchema(m.readTree(schema));
JsonNode json = m.readTree(data);
ProcessingReport report = jsonSchema.validate(json);
System.out.println(report);
报告包含不同输入案例的详细错误。例如,有了这个输入
{
"id": 1,"name": "nameWithSpecialChar$"
}
这个输出被打印出来
--- BEGIN MESSAGES ---
error: ECMA 262 regex "^[a-zA-Z]*$" does not match input string "nameWithSpecialChar$"
level: "error"
schema: {"loadingURI":"#","pointer":"/properties/name"}
instance: {"pointer":"/name"}
domain: "validation"
keyword: "pattern"
regex: "^[a-zA-Z]*$"
string: "nameWithSpecialChar$"
--- END MESSAGES ---
或者不只是打印报告,您可以遍历所有错误并拥有您的特定逻辑
for (ProcessingMessage message : report) {
// Add your logic here
}
您可以查看 example code 以获取有关如何使用图书馆的更多信息。
Java SE + Spring数据+休眠
我正在尝试使用Spring Data + Hibernate启动Java SE应用程序,并且到目前为止已经完成了以下工作:
配置文件
@Configuration
@PropertySource("classpath:hibernate.properties")
@EnableJpaRepositories
@EnableTransactionManagement
public class JpaConfiguration {
private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN =
"entitymanager.packages.to.scan";
@Resource
private Environment env;
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(
env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new
LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPersistenceProviderClass(org.hibernate
.jpa.HibernatePersistenceProvider.class);
entityManagerFactoryBean.setPackagesToScan(env.
getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
entityManagerFactoryBean.setJpaProperties(hibProperties());
return entityManagerFactoryBean;
}
private Properties hibProperties() {
Properties properties = new Properties();
properties.put(PROPERTY_NAME_HIBERNATE_DIALECT,env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL,env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
return properties;
}
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
@Bean
public MainBean mainBean() {
return new MainBean();
}
}
开始上课
public class Start {
private static final String CONFIG_PACKAGE = "org.app.config";
public static void main(String[] args) {
try (AnnotationConfigApplicationContext ctx = new
AnnotationConfigApplicationContext()) {
ctx.scan(CONFIG_PACKAGE);
ctx.refresh();
MainBean bean = ctx.getBean(MainBean.class);
bean.start();
}
}
}
主豆
public class MainBean {
public void start() {
System.out.println("Application Started. . .");
}
}
但是我收到以下异常
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [C:\MyPath\target\classes\org\app\config\JpaConfiguration.class]; nested exception is java.lang.IllegalArgumentException
at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:281)
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:220)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.scan(AnnotationConfigApplicationContext.java:153)
at org.app.Start.main(Start.java:25)
Caused by: java.lang.IllegalArgumentException
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.asm.ClassReader.<init>(Unknown Source)
at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:257)
... 4 more
有人知道我在做什么错吗?
java – Spring Roo更新密码字段或不更新所有字段
用户还有一个密码属性.我在列表/显示表单中禁用了它的渲染,但在更新表单中,字段设置为type =“password”.
我不知道的是,如果没有重新输入密码就无法更新用户,因为没有明星,如果你没有输入密码,密码设置为null或“”.
我怎么能绕过那个?
还有另一个问题.如果我从更新表单中删除一些字段,则所有其他字段都设置为null.
我想要的是使用户能够更新某些权利的某些领域,但不是所有领域.
解决方法
在这个实体的update.jspx中,我为字段f1设置了属性render =“false”.
在FooController更新方法中,在更新foo参数对象之前,我从db中获取旧值并将其粘贴到参数foo中,如下所示,因为我们不希望最终用户更新此字段.
Foo fromDB=Foo.findFoo(foo.getId()); foo.setF1(fromDB.getF1()); foo.merge();
我能够验证更新操作完成后Foo实体中f1的旧值没有得到更改.
这可能是阻止用户更新实体对象中某些字段的一种方法,并希望这种方法适合您.
干杯,
java – spring-data-cassandra存储库的多个密钥空间支持?
@Configuration @EnableCassandraRepositories(basePackages = "com.blah.repository") public class CassandraConfig extends AbstractCassandraConfiguration { @Override public String getKeyspaceName() { return "keyspace1"; }
在将存储库类移动到另一个包之后,我尝试创建第二个配置类.
@Configuration @EnableCassandraRepositories(basePackages = "com.blah.secondrepository") public class SecondCassandraConfig extends AbstractCassandraConfiguration { @Override public String getKeyspaceName() { return "keyspace2"; }
但是,在这种情况下,第一个集合,如果存储库失败,因为在键空间中找不到实体的已配置列族.我认为它可能正在寻找第二个键空间中的列族.
spring-data-cassandra是否支持多个密钥空间存储库?我找到多个键空间的引用的唯一地方是here.但它没有解释是否可以使用存储库完成此操作?
解决方法
http://valchkou.com/spring-boot-cassandra.html#multikeyspace
您需要的Idea会覆盖默认bean:sessionfactory和template
样品:
1)application.yml
spring: data: cassandra: test1: keyspace-name: test1_keyspace contact-points: localhost test2: keyspace-name: test2_keyspace contact-points: localhost
2)基本配置类
public abstract class CassandraBaseConfig extends AbstractCassandraConfiguration{ protected String contactPoints; protected String keyspaceName; public String getContactPoints() { return contactPoints; } public void setContactPoints(String contactPoints) { this.contactPoints = contactPoints; } public void setKeyspaceName(String keyspaceName) { this.keyspaceName = keyspaceName; } @Override protected String getKeyspaceName() { return keyspaceName; } }
3)配置test1的实现
package com.sample.repo.test1; @Configuration @ConfigurationProperties("spring.data.cassandra.test1") @EnableCassandraRepositories( basePackages = "com.sample.repo.test1",cassandratemplateRef = "test1Template" ) public class Test1Config extends CassandraBaseConfig { @Override @Primary @Bean(name = "test1Template") public CassandraAdminoperations cassandratemplate() throws Exception { return new CassandraAdminTemplate(session().getobject(),cassandraConverter()); } @Override @Bean(name = "test1Session") public CassandraSessionfactorybean session() throws Exception { CassandraSessionfactorybean session = new CassandraSessionfactorybean(); session.setCluster(cluster().getobject()); session.setConverter(cassandraConverter()); session.setKeyspaceName(getKeyspaceName()); session.setSchemaAction(getSchemaAction()); session.setStartupScripts(getStartupScripts()); session.setShutdownScripts(getShutdownScripts()); return session; } }
4)同样适用于test2,只需使用不同的包
package com.sample.repo.test2;
5)在专用包中为每个键空间放置repo
即
package com.sample.repo.test1; @Repository public interface RepositoryForTest1 extends CassandraRepository<MyEntity> { // .... } package com.sample.repo.test2; @Repository public interface RepositoryForTest2 extends CassandraRepository<MyEntity> { // .... }
关于java – Spring数据存储库的字段字段查找方法和spring查询数据库的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射、Java SE + Spring数据+休眠、java – Spring Roo更新密码字段或不更新所有字段、java – spring-data-cassandra存储库的多个密钥空间支持?的相关信息,请在本站寻找。
本文标签: