java - 没有找到能够从类型 [java.lang.String] 转换为类型 [@Autowired @ManyToOne @JoinColumn com.papertrue.country.Country] 的转换器
问题描述
所以我对 JPA 很陌生,在将一个对象映射到另一个对象时我被卡住了。这是我的用户实体:
package com.papertrue.user;
import com.papertrue.country.Country;
import com.papertrue.currency.Currency;
@Entity
@ConfigurationProperties("user")
@Table(name = "users")
public class User {
@Id
@Column(name = "id")
private String userId;
private String name;
@Column(name = "phone_ext")
private String phoneExt;
@Column(name = "phone_no")
private String phoneNo;
private String email;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "country")
private Country country;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "currency")
private Currency currency;
@Column(name = "fb_id")
private String facebookId;
@Column(name = "google_id")
private String googleId;
@Column(name = "current_balance")
private int currentBalance;
@Column(name = "is_enabled")
private boolean isEnabled;
@Column(name = "free_sample_used")
private boolean isfreeSampleUsed;
@Column(name = "client_id")
private String clientId;
}
我的国家实体:
package com.papertrue.country;
import com.papertrue.currency.Currency;
@Entity
@ConfigurationProperties("country")
@Table(name = "countries")
public class Country {
@Id
private String code;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "currency")
private Currency currency;
@Column(name = "isd_ext")
private String ISDExt;
@Enumerated(EnumType.STRING)
private transient Region region;
}
还有我的货币实体:
package com.papertrue.currency;
@Entity
@ConfigurationProperties("currency")
@Table(name = "currencies")
public class Currency {
@Id
private String code;
private String symbol;
private String name;
private int multiplier;
@Column(name = "minVal")
private int minValue;
}
因此,当我在 Country 对象中映射 Currency 时它可以工作,但是当我对 User 和 Country 做同样的事情时,它就不行了。我得到org.springframework.core.convert.ConverterNotFoundException
。这是错误:
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) ~[spring-test-5.3.0.jar:5.3.0]
Caused by: org.springframework.boot.context.properties.ConfigurationPropertiesBindException: Error creating bean with name 'user-com.papertrue.user.User': Could not bind properties to 'User' : prefix=user, ignoreInvalidFields=false, ignoreUnknownFields=true; nested exception is org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'user.country' to com.papertrue.country.Country
... 70 common frames omitted
Caused by: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'user.country' to com.papertrue.country.Country
... 89 common frames omitted
Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [@javax.persistence.ManyToOne @javax.persistence.JoinColumn com.papertrue.country.Country]
... 105 common frames omitted
这发生在我运行测试时:
package com.papertrue;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import com.papertrue.exceptions.PaperTrueUserNotFoundException;
import com.papertrue.user.UserService;
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void contextLoads() {
// Testing getEmailInstance
System.out.println("====== getEmailInstance() ======");
try {
System.out.println(userService.getEmailInstance("text@papertrue.com").getName());
} catch (PaperTrueUserNotFoundException e) {
e.printStackTrace();
}
}
@SpringBootApplication
static class TestConfiguration {
}
}
用户服务服务:
package com.papertrue.user;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Service;
import com.papertrue.exceptions.PaperTrueUserNotFoundException;
@Service
@EnableConfigurationProperties(User.class)
public class UserService {
@Autowired
private UserRepository userRepository;
/**
* Returns user whose email matches to parameter email's value.
*
* @param email
* @return
* @throws PaperTrueUserNotFoundException
*/
public User getEmailInstance(String email) throws PaperTrueUserNotFoundException {
Optional<User> optional = userRepository.findByEmail(email);
if (optional.isPresent()) {
return optional.get();
}
throw new PaperTrueUserNotFoundException("User Not Found");
}
}
以及供参考的存储库:
package com.papertrue.user;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, String> {
Optional<User> findByEmail(String email);
}
解决方案
该异常告诉您它无法按照@ConfigurationProperties
. 因为对于 country 它有一个String
值(可能在 中application.properties
)但需要 aCountry
并且没有转换器。
这就提出了一个问题:“你想用@ConfigurationProperties
注释来达到什么目的?”
在 JPA 实体上使用它至少是非正统的,因为 bean 和实体通常是两个非常不同的东西。
因此,您应该删除@ConfigurationProperties
注释或注册自定义转换器,如下所述:
https ://www.logicbig.com/tutorials/spring-framework/spring-boot/custom-configuration-properties-binding.html
推荐阅读
- javascript - 数据表无法重新初始化数据表并且销毁不起作用
- algorithm - 是否有任何有效的算法来检查我是否至少有一个有效组合可以从一组有效组合中获胜?
- android - 应用缓慢。有人可以建议我该怎么做吗?
- vba - Excel VBA手动选择一个文件夹来循环遍历其中的所有excel文件
- python - 使用 Beautifulsoup4 查找 .nextsibling
- javascript - 正则表达式匹配第二个单词的开头字母
- javascript - 显示 table1 中的所有数据与 table2 匹配的记录,并将结果显示到 html 表中
- clion - 是否可以将 cpp-reference.com 文档包含到 clion 的快速文档查看器中?
- html - Css显示网格显示有边框问题
- javascript - 在对象数组中查找颜色属性