SpringREST数据中的JPA2.0属性访问--未调用某些getter
我对SpringBoot和SpringDataREST还是一个新手,希望有人在通过属性访问方面有经验。由于我无法更改以非规范化方式存储字母类型的数据库(varchar中的分隔字符串),因此我认为可以利用属性中的一些逻辑来克服这一问题。但是我注意到,当使用属性访问时,我的一些getter从未被调用 我的型号代码:SpringREST数据中的JPA2.0属性访问--未调用某些getter,jpa,spring-boot,spring-data-jpa,spring-data-rest,Jpa,Spring Boot,Spring Data Jpa,Spring Data Rest,我对SpringBoot和SpringDataREST还是一个新手,希望有人在通过属性访问方面有经验。由于我无法更改以非规范化方式存储字母类型的数据库(varchar中的分隔字符串),因此我认为可以利用属性中的一些逻辑来克服这一问题。但是我注意到,当使用属性访问时,我的一些getter从未被调用 我的型号代码: package ... import ... @Entity @Table(name="letters", catalog="clovisdb") @Access(AccessType
package ...
import ...
@Entity
@Table(name="letters", catalog="clovisdb")
@Access(AccessType.PROPERTY)
public class Letter {
public enum PhoneticType {
VOWEL, SHORT, LONG, COMMON;
public static boolean contains(String s) { ... }
}
public enum PositionType {
ALL, INITIAL, MEDIAL, FINAL;
public static boolean contains(String s) { ... }
}
public enum CaseType {
ALL, LOWER, UPPER;
public static boolean contains(String s) { ... }
}
private int id;
private String name;
private String translit;
private String present;
private List<PhoneticType> phoneticTypes;
private CaseType caseType;
private PositionType positionType;
@Id
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getTranslit() { return translit; }
public void setTranslit(String translit) { this.translit = translit; }
public String getPresent() { return present; }
public void setPresent(String present) { this.present = present; }
public String getTypes() {
StringBuilder sb = new StringBuilder(); //
if (phoneticTypes!=null) for (PhoneticType type : phoneticTypes) sb.append(" ").append(type.name());
if (caseType!=null) sb.append(" ").append(caseType.name());
if (positionType!=null) sb.append(" ").append(positionType.name());
return sb.substring( sb.length()>0?1:0 );
}
public void setTypes(String types) {
List<PhoneticType> phoneticTypes = new ArrayList<PhoneticType>();
CaseType caseType = null;
PositionType positionType = null;
for (String val : Arrays.asList(types.split(" "))) {
String canonicalVal = val.toUpperCase();
if (PhoneticType.contains(canonicalVal)) phoneticTypes.add(PhoneticType.valueOf(canonicalVal));
else if (CaseType.contains(canonicalVal)) caseType = CaseType.valueOf(canonicalVal);
else if (PositionType.contains(canonicalVal)) positionType = PositionType.valueOf(canonicalVal);
}
this.phoneticTypes = phoneticTypes;
this.caseType = (caseType==null)? CaseType.ALL : caseType;
this.positionType = (positionType==null)? PositionType.ALL : positionType;
}
@Override
public String toString() { .... }
}
package ...
import ...
@RepositoryRestResource
public interface LetterRepository extends CrudRepository<Letter, Integer> {
List<Letter> findByTypesLike(@Param("types") String types);
}
setId
setName
setPresent
setTranslit
setTypes
(getId not called)
getName
getTranslit
getPresent
(getTypes not called !!)
为上述URI返回的json反映了调用的所有getter,并且没有错误
{
"name" : "alpha",
"translit" : "`A/",
"present" : "Ἄ",
"_links" : {
"self" : {
"href" : "http://mytestserver.com:8080/letters/6"
}
}
}
但是为什么我的getTypes()没有被调用,我的JSON对象缺少“types”属性呢?我注意到setter被调用,这使我对它更加陌生
任何帮助都将不胜感激
提前感谢这可能是因为您没有字段
types
,所以getTypes()
不是合适的getter。尝试将其添加到实体中
@Transient
private String types;
我不知道内部是如何工作的,但有可能是先扫描类中的字段,然后为每个字段调用一个getter。由于没有类型
字段,因此不会调用getter。Setter被调用可能是一个特性,但如果它是一个bug,我也不会感到惊讶,因为findByTypesLike
应该转换为查找类型
字段类似于
,而类型
不是字段的字母
您可以尝试的另一件事是使用
@JsonInclude
注释该getter。Spring版本3.2+中的Jackson 2注释(也向后移植到3.1.2)。感谢您的快速响应。添加unnotated types字段成功了。然后调用getter(除了setter之外)。用瞬间的注释又把它弄坏了。但是用JsonInclude注释是有效的。