Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringREST数据中的JPA2.0属性访问--未调用某些getter_Jpa_Spring Boot_Spring Data Jpa_Spring Data Rest - Fatal编程技术网

SpringREST数据中的JPA2.0属性访问--未调用某些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

我对SpringBoot和SpringDataREST还是一个新手,希望有人在通过属性访问方面有经验。由于我无法更改以非规范化方式存储字母类型的数据库(varchar中的分隔字符串),因此我认为可以利用属性中的一些逻辑来克服这一问题。但是我注意到,当使用属性访问时,我的一些getter从未被调用

我的型号代码:

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注释是有效的。