Если оба / getJson и / getJson2 отображаются на этот класс действия, они оба ответят доступными свойствами: user и user2.

я есть следующий код, и я хотел бы добиться функциональности, что / getJson будет возвращать пользовательский объект как json и / getJson2 будет возвращать user2 как объект Json.

@ParentPackage("json-default")
public class JsonAction extends ActionSupport{
private User user = new User("John","Smith"); 
private User user2 = new User("Smith","John"); 
public String populate(){

    return "populate";
}

@Action(value="/getJson", results = {
        @Result(name="success", type="json")})
public String test(){
    return "success";
}

@Action(value="/getJson2", results = {
        @Result(name="success", type="json")})
public String test2(){
    return "success";
}

@JSON(name="user")
public User getUser() {
    return user;
}

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

@JSON(name="user2")
public User getUser2() {
    return user2;
}

public void setUser2(User user2) {
    this.user2 = user2;
}
}

В настоящее время независимо от того, какой метод я вызываю, я все равно получаю следующий результат:

{"user":{"firstName":"John","lastName":"Smith"},"user2":{"firstName":"Smith","lastName":"John"}}

Является ли это возможным?

Обновить:

Я изменил код:

public class JsonAction extends ActionSupport{
private User user = new User("John","Smith"); 
private User user2 = new User("Smith","John"); 
public String populate(){

    return "populate";
}

@Action(value="/getJson", results = {
        @Result(name="success", type="json",params = {
                "includeProperties",
                "user"})})
public String test(){
    return "success";
}

@Action(value="/getJson2", results = {
        @Result(name="success", type="json",params = {
                "includeProperties",
                "user2"})})
public String test2(){
    return "success";
}

@JSON(name="user")
public User getUser() {
    return user;
}

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

@JSON(name="user2")
public User getUser2() {
    return user2;
}

public void setUser2(User user2) {
    this.user2 = user2;
}
}

Теперь я получаю

{"user":{}}

а также

{"user2":{}}
 Quaternion11 янв. 2011 г., 01:20
Я не вижу проблемы. Я бы в это время удалил сеттеры (я не знаю, есть ли у вас какая-то пружинная магия, которая могла бы вызвать странности), переместил бы создание пользователя в метод prepare и проверил бы, что пользователи не равны нулю (см.struts.apache.org/2.0.14/docs/prepare-interceptor.html), и это всего лишь личное предпочтение, но @JSON (name = "user") при применении к getUser является избыточным, поэтому я бы избавился от аннотаций @JSON в методах получения.

Ответы на вопрос(3)

Решение Вопроса

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

Ниже приведен пример.

Методы getJson1 и getJson2 показывают includeParameters, а getJson3 показывает excludeParameters.

Примечание. Хотя в этом примере в качестве аргументов для параметров include / exclude используются строки, строка интерпретируется как регулярное выражение. Таким образом, я мог заменить «string1, string2» на action3 на «string *».

Для получения дополнительной информации см .:https://cwiki.apache.org/confluence/display/WW/JSON%20Plugin

package struts2;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;

@ParentPackage("json-default")
public class Test2 extends ActionSupport {

    private String string1 = "One";
    private String string2 = "Two";
    private String other = "Other";

    public String getString1() {
        return this.string1;
    }

    public String getString2() {
        return this.string2;
    }

    public String getOther() {
        return this.other;
    }

    @Action(value="/getJson1", results = {
        @Result(type = "json", params = {
            "includeProperties",
            "string1"
        })})
    public String action1() {
        return ActionSupport.SUCCESS;
    }

    @Action(value="/getJson2", results = {
        @Result(type = "json", params = {
            "includeProperties",
            "string2"
        })})
    public String action2() {
        return ActionSupport.SUCCESS;
    }

    @Action(value="/getJson3", results = {
        @Result(type = "json", params = {
            "excludeProperties",
            "string1, string2"
        })})
    public String action3() {
        return ActionSupport.SUCCESS;
    }
}

... / getJson1 возвращает {"string1": "One"}

... / getJson2 возвращает {"string2": "Two"}

... / getJson3 возвращает {"прочее": "прочее"}

 danny.lesnik11 янв. 2011 г., 00:37
Здравствуйте, я изменил код в соответствии с вашим примером, но теперь я получаю пустую строку JSON, пожалуйста, смотрите обновление. Заранее спасибо.

которые вы хотите сериализовать. Это включает в себя свойства класса User, например, так:

@Action(value="/getJson", results = {
        @Result(name="success", type="json",params = {
                "includeProperties",
                "user\.firstName, user\.lastName"})})

Но другой формой для получения этой работы может быть использование регулярных выражений:

@Action(value="/getJson", results = {
        @Result(name="success", type="json",params = {
                "includeProperties",
                "user\..*"})})

С уважением.

Если оба / getJson и / getJson2 отображаются на этот класс действия, они оба ответят доступными свойствами: user и user2.

Ваш ответ на вопрос