我有一个用户详细信息类,我放置了地址类来存储每个用户详细信息类的多个addressess。我正在使用Spring 4.0。下面给出了代码:
UserDetails类:
JSONObject jsonObjcart = new JSONObject(myJSONCartProducts);
jsonarrayCartProducts = jsonObjcart.getJSONArray("cartproducts");
cartarraylist = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < jsonarrayCartProducts.length(); i++) {
HashMap<String, String> lmap = new HashMap<String, String>();
JSONObject p = jsonarrayCartProducts.getJSONObject(i);
// Retrive JSON Objects
lmap.put("products_id", p.getString("products_id"));
lmap.put("products_name", p.getString("products_name"));
lmap.put("products_price", p.getString("products_price"));
lmap.put("products_image", p.getString("products_image"));
lmap.put("customers_basket_quantity", p.getString("customers_basket_quantity"));
lmap.put("products_price_total", p.getString("products_price_total"));
lmap.put("pcustomersid", customersid);
lmap.put("pcountryid", countryid);
lmap.put("customers_basket_id", p.getString("customers_basket_id"));
// Set the JSON Objects into the array
cartarraylist.add(lmap);
}
地址类:
p.getString("customers_basket_quantity")
在这个例子中,Address.area值需要在运行时传递,然后我需要为Address类创建一个对象。然后它需要在UserDetails类中添加List地址变量。同样我需要在arrayList中添加n个数字对象然后我需要为UserDetails类创建一个对象。
我尝试了以下代码:
int qtySum=0;
int qtyNum;
部分输出: 用户大小:1 用户详细信息:YYY
预期产出: 用户大小:2 用户详细信息:XXX 用户详细信息:YYY
你能帮忙解决这个问题。
答案 0 :(得分:2)
我并不完全清楚为什么你想要使用Spring创建看似是域对象的东西,但它看起来就是你从代码中做的事情。
Spring有Scope概念来控制从ApplicationContext
检索bean时会发生什么。默认的Scope是 singleton ,这意味着您只能在ApplicationContext
中获得一个bean实例。这意味着您的调用context.getBean("address")
始终返回相同的对象。
至于您使用@Component
注释执行的布线;扫描类路径时(通常在应用程序启动时)会发生这种情况。此时Spring会实例化标有@Component
的每个类的单个实例,其中一个Address
和一个UserDetails
。在设置Address
字段之前,Spring非常聪明,可以将单List
添加到address
,但这就完全可以了。
然后,您的代码会从ApplicationContext
设置同一对象上的区域两次检索此对象,因此调试语句的打印原理与此相同。
这解释了您的代码发生了什么,但是没有回答如何修复它的问题。
正如我所说的,我无法理解为什么你会使用Spring构建一个看起来像域模型的东西。就每个类的实例而言,域模型通常不会提前知道,因此Spring不是用于创建此类模型的适当工具(Spring通常用于将应用程序本身连接在一起)。
您应该修改域类&#39;像这样的构造函数:
public Address
{
private String area;
public Address(String area)
{
this.area = area;
}
...
}
public UserDetails
{
private List<Address> addresses;
public UserDetails(Address... addresses)
{
this.addresses = Arrays.asList(addresses);
}
...
}
然后可以重写主要方法:
public static void main(String[] args)
{
UserDetails userDetails = new UserDetails(
new Address("XXX"),
new Address("YYY"),
);
System.out.println("User Size: " + application.getAddress().size());
System.out.println("User Details: " + application.getAddress().get(0).getArea());
System.out.println("User Details: " + application.getAddress().get(1).getArea());
}
答案 1 :(得分:0)
请注意,您将获得两次相同的bean,因此您无法在UserDetails列表中进行两次注入:
Address address = (Address)context.getBean("address");
...
Address address1 = (Address)context.getBean("address");
这样的事情应该有效:
@Configuration
public class AppConfig{
@Bean
public UserDetails userDetails(){
return new UserDetails();
}
@Bean
public Address addressXXX(){
return new Address();
}
@Bean
public Address addressYYY(){
return new Address();
}
}
然后你的代码:
Address address = (Address)context.getBean("addressXXX");
//setting first value:
address.setArea("XXX");
Address address1 = (Address)context.getBean("addressYYY");
//setting second value
address1.setArea("YYY");
UserDetails userDetails = (UserDetails)context.getBean("userDetails");
System.out.println("User Size: "+application.getAddress().size());
System.out.println("User Details : "+application.getAddress().get(0).getArea()); //--->XXX
System.out.println("User Details : "+application.getAddress().get(1).getArea()); //--->YYY