1

実装した新しい休憩サービスをテストしています。このサービスは、@ResponseBody を通じて Json を返します。各コントローラーで、同じ構造を返します。

-コード

-メッセージ

-オブジェクトのリスト

私が返すオブジェクトは、コードとメッセージを取得する親クラスに拡張されるリストを持つメッセージです。これらは私のクラスです:

private class SimpleMessage{
        ResponseCode code;
        String message;
        public ResponseCode getCode() {
            return code;
        }
        public void setCode(ResponseCode code) {
            this.code = code;
        }
        public String getMessage() {
            return message;
        }
        public void setMessage(String message) {
            this.message = message;
        }
        public void setCodeAndMessage(ResponseCode code, String message){
            this.code = code;
            this.message = message;
        }
    }

private class MessageResponse<T> extends SimpleMessage{
    List<T> list;
    public List<T> getList() {
        return list;
    }
    public void setList(List<T> list) {
        this.list = list;
    }
}   

SimpleMessage を返そうとすると、うまくいきます。しかし、問題は MessageResponse クラスに関連しています。たとえば、リスト内の User クラスのインスタンスを含むこのクラスを返すと、Tomcat サーバーを停止するまで無限ループで実行されます。

これは私のコントローラーです

public @ResponseBody SimpleMessage isUserSuscribed(@RequestBody String data){
    MessageResponse<User> msg = new MessageResponse<User>();
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    JsonNode node;
    try {
        node = mapper.readTree(data);
        BasicUser manager = mapper.convertValue(node.get("manager"), BasicUser.class); 
        User user = userService.getUserByOpenid(mapper.convertValue(node.get("openid"), String.class));
        msg.setList(Lists.newArrayList(user));
    } catch (JsonProcessingException e) {
        log.debug(e.toString());
        msg.setCodeAndMessage(ResponseCode.error, "Malformed JSON \n" + e.getMessage());
    } catch (IOException e1) {
        log.debug(e1.toString());
        msg.setCodeAndMessage(ResponseCode.error, "Application error");
    }   
    msg.setCodeAndMessage(ResponseCode.success, "success");
    return msg;
}

ユーザークラス:

public class User extends AbstractPropertySearcher{

    private String username;

    private String password;

    private String email;

    private Boolean active;

    private String metadata;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    public String getMetadata() {
        return getMeta().getMetadata();
    }

    public void setMetadata(String metadata) {
        this.metadata = metadata;
    }

    public enum KnownUsers{
        TEST, SYSTEM
    }

    public User() {
        this.roles = new HashSet<String>();
        this.profiles = new HashSet<String>();
        this.geoareas = new HashSet<String>();
        this.properties = new HashSet<Property>();
    }

    public User(String username) {
        this.username = username;
        this.roles = new HashSet<String>();
        this.profiles = new HashSet<String>();
        this.geoareas = new HashSet<String>();
        this.properties = new HashSet<Property>();
    }

    public User(User o) {
        try{
            PropertyUtils.copyProperties(this, o);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private Set<String> roles;

    private Set<String> profiles;

    private Set<String> geoareas;

    public Set<String> getRoles() {
        return roles;
    }
    public void setRoles(Set<String> roles) {
        this.roles = roles;
    }
    public Set<String> getProfiles() {
        return profiles;
    }
    public void setProfiles(Set<String> profiles) {
        this.profiles = profiles;
    }
    public Set<String> getGeoareas() {
        return geoareas;
    }
    public void setGeoareas(Set<String> geoareas) {
        this.geoareas = geoareas;
    }

    private Set<Property> properties;
    private Map<String,Property> mappedProperties;

    public Map<String,Property> getMappedProperties(){
        if(mappedProperties==null){
            mappedProperties = new HashMap<String,Property>();
            for(Property prop : getProperties()){
                mappedProperties.put(prop.getProperty(),prop);
            }           
        }
        return mappedProperties;
    }

    public Property getPropertyByName(KnownProperty knownProperty) throws PropertyNotFoundException{
        return getPropertyByName(knownProperty.getPropertyName());
    }

    public void setProperty(Property property){
        setProperty(properties, property);
    }

    public boolean hasRole(Role.KnownRoles role){
        return roles.contains(role.name());
    }

    public Set<Property> getProperties() {
        return properties;
    }
    public void setProperties(Set<Property> properties) {
        this.properties = properties;
    }

    public String toString(){
        return getUsername();
    }

    public int hashCode(){
        return toString().hashCode();
    }

    public boolean equals(Object o){
        if(o instanceof User){
            return getUsername().equals(((User) o).getUsername());
        }
        return false;
    }

    public Property getBannerProperty() throws PropertyNotFoundException{
        return AbstractPropertySearcher.getPropertyByName(getProperties(), KnownProperty.BANNER.getPropertyName());
    }

    private Metadata meta;

    public Metadata getMeta(){
        if(meta == null){
            meta = new Metadata(metadata);
        }
        return meta;
    }

    public enum KnownMetaProperty{
        REGISTRATION_DATE, LAST_ACCESS_DATE
    }

    public String getRegistrationDate(){
        return getMeta().getVariable(KnownMetaProperty.REGISTRATION_DATE.name());
    }

    public String getLastAccessDate(){
        return getMeta().getVariable(KnownMetaProperty.LAST_ACCESS_DATE.name());
    }

}

これはログのエラーです:

org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.StackOverflowError

誰でもこの問題を手伝ってもらえますか? ありがとうございました

4

0 に答える 0