2016-02-04 2 views
1

Я пробовал несколько версий и читал несколько связанных ответов, но я все еще не могу понять, почему Struts не заполняет мое свойство Action user.Struts2 JSON to Java Action Object (не могу найти ошибку)

Это мой Аякс вызов

function save_new_user() { 

    var user = 
    {  username: $('#new_user_username').val(), 
      email: $('#new_user_email').val(), 
      password: $('#new_user_password').val()   
    }; 

    user_json = JSON.stringify(user); 
    console.log(user_json); 

    var data = {'user': user_json}; 

    $.ajax({ 
     type : 'GET', 
     url : 'SaveNewUser', 
     data: data, 
     dataType : "json", 
     contentType: 'application/json', 
     success : function(data, textStatus, jqXHR) { 
      if(data) { 

      } 
     }, 
    }); 
} 

, который, кстати, напечатать в консоли

{"username":"dd","email":"ff","password":"gg"} 

Моего Действие класс (с аннотациями), (я не модифицируя json-default перехватчика от Struts2-JSon-плагин-2.3.24.1) является

package coproject.cpweb.actions; 

import org.apache.struts2.convention.annotation.Action; 
import org.apache.struts2.convention.annotation.ParentPackage; 
import org.apache.struts2.convention.annotation.Result; 
import org.apache.struts2.convention.annotation.Results; 

import com.opensymphony.xwork2.ActionSupport; 

import coproject.cpweb.utils.db.entities.UserDum; 
import coproject.cpweb.utils.db.services.DbServicesImp; 

@Action("SaveNewUser") 
@ParentPackage("json-default") 
@Results({ 
    @Result(name="success", type="json"), 
    @Result(name="input", location="/views/error.jsp") 
}) 
public class SaveNewUser extends ActionSupport{ 

    private static final long serialVersionUID = 1L; 

    /* Services */ 
    DbServicesImp dbServices; 

    public DbServicesImp getDbServices() { 
     return dbServices; 
    } 

    public void setDbServices(DbServicesImp dbServices) { 
     this.dbServices = dbServices; 
    } 

    /* Input Json */ 
    private UserDum user = new UserDum(); 

    public UserDum getUser() { 
     return user; 
    } 

    public void setUser(UserDum user) { 
     this.user = user; 
    } 

    /* Execute */ 
    public String execute() throws Exception { 

     // dbServices.saveUser(user); 

     System.out.println(user.getUsername()); 

     return "SUCCESS"; 
    } 


} 

И UserDum объект является

package coproject.cpweb.utils.db.entities; 

public class UserDum { 

    private String username; 
    private String email; 
    private String password; 

    public String getUsername() { 
     return username; 
    } 
    public void setUsername(String username) { 
     this.username = username; 
    } 
    public String getEmail() { 
     return email; 
    } 
    public void setEmail(String email) { 
     this.email = email; 
    } 
    public String getPassword() { 
     return password; 
    } 
    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

Однако, когда приходит запрос, то json перехватчик распорок-JSon-плагин получает исключение пытается установить «пользователь».

feb 04, 2016 12:20:14 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error 
SEVERE: Developer Notification (set struts.devMode to false to disable this message): 
Unexpected Exception caught setting 'user' on 'class coproject.cpweb.actions.SaveNewUser: Error setting expression 'user' with val 
ue ['{"username":"dd","email":"ff","password":"gg"}', ] 
feb 04, 2016 12:20:14 PM com.opensymphony.xwork2.util.LocalizedTextUtil warn 
WARNING: Missing key [invalid.fieldvalue.user] in bundles [[org/apache/struts2/struts-messages, com/opensymphony/xwork2/xwork-mess 
ages]]! 

Любые подсказки о том, что может быть ошибкой?

+0

Вам нужно использовать 'JSONInterceptor'. –

+0

спасибо, я думал, что пакет json-default уже включил бы его. Должен ли я продлить пакет json-default? У вас есть, случайно, пример того, что я должен добавить? –

ответ

1

Продвинутый json-default пакет не устанавливает json перехватчик для перехватчиков defaultStack, он просто определяет, что есть такой перехватчик.

Использование interceptorRefs в вашем @Action аннотацию установить json перехватчик и defaultStack к действию.

@Action(value="SaveNewUser", 
     interceptorRefs={ @InterceptorRef("json"), 
          @InterceptorRef("defaultStack") }) 

Или @InterceptorRefs на уровне класса применять перехватчики для всех действий, определенных в этом классе.

@InterceptorRefs({ 
    @InterceptorRef("json"), 
    @InterceptorRef("defaultStack") 
}) 
+0

Я добавил это как аннотации к действию ' @Action (значение = "SaveNewUser", interceptorRefs = {@ InterceptorRef ("JSON"), @InterceptorRef ("defaultStack")}) @ParentPackage (" JSon -default ") @Results ({ \t @result (имя =" успех», тип = "JSON"), \t @result (имя = "вход", расположение = "/ просмотров/error.jsp") }) '\t И не знаю, что ошибка отображается, но похоже, что действие не выполняется. Кажется, что ничего не происходит на стороне сервера после запроса ... –

+0

@JoseOspina Попробуйте использовать '@ InterceptorRefs' и без' interceptorRefs' в '@ Action'. –

+0

теперь мое затмение сошло с ума и не обнаруживает импорт ... я удалю. Metadata и начну ... как это весело. Я дам вам знать, как это происходит. –