Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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
Java SpringMVC 3转换<;表格:复选框..>;将字符串[]返回到实体对象_Java_Spring Mvc_Annotations_Spring 3 - Fatal编程技术网

Java SpringMVC 3转换<;表格:复选框..>;将字符串[]返回到实体对象

Java SpringMVC 3转换<;表格:复选框..>;将字符串[]返回到实体对象,java,spring-mvc,annotations,spring-3,Java,Spring Mvc,Annotations,Spring 3,我有一个实体活动,与活动城市有一个OneTone关系。 反过来,活动城市包含一组城市 活动实体 @Entity @javax.persistence.Table(uniqueConstraints={@UniqueConstraint(columnNames={"name","company_id"}), @UniqueConstraint(columnNames={"id"})}) public class Campaign implements Serializab

我有一个实体活动,与活动城市有一个OneTone关系。 反过来,活动城市包含一组城市

活动实体

    @Entity 
    @javax.persistence.Table(uniqueConstraints={@UniqueConstraint(columnNames={"name","company_id"}), @UniqueConstraint(columnNames={"id"})})
    public class Campaign implements Serializable {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        private Long id;

        @NotEmpty
        @Size(min=1, max=100)
        private String name;

        private Date startDate;

        private Date endDate;

        @Valid
        private Deal deal;

        @Valid
        private Company company;

        @OneToOne
        private CampaignCities cities = new CampaignCities();
@Entity
public class CampaignCities {
    private long id;
    private Set<City> cities = new HashSet<City>();

    @Id
    @javax.persistence.GeneratedValue(strategy=GenerationType.AUTO)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @OneToMany
    public Set<City> getCities() {
        return cities;
    }

    public void setCities(Set<City> cities) {
        this.cities = cities;
    }
}
活动城市实体

    @Entity 
    @javax.persistence.Table(uniqueConstraints={@UniqueConstraint(columnNames={"name","company_id"}), @UniqueConstraint(columnNames={"id"})})
    public class Campaign implements Serializable {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        private Long id;

        @NotEmpty
        @Size(min=1, max=100)
        private String name;

        private Date startDate;

        private Date endDate;

        @Valid
        private Deal deal;

        @Valid
        private Company company;

        @OneToOne
        private CampaignCities cities = new CampaignCities();
@Entity
public class CampaignCities {
    private long id;
    private Set<City> cities = new HashSet<City>();

    @Id
    @javax.persistence.GeneratedValue(strategy=GenerationType.AUTO)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @OneToMany
    public Set<City> getCities() {
        return cities;
    }

    public void setCities(Set<City> cities) {
        this.cities = cities;
    }
}
我的新活动控制器

@SessionAttributes(value={"campaign", "campaignCities"})
@Controller
public class NewCampaignController {
    //private static final Logger logger = LoggerFactory.getLogger(NewDealController.class);

    @Autowired
    private CampaignManager campaignManager;
    @Autowired
    private CityManager cityManager;
    @Autowired
    SimpleDateFormat dateFormat;
    @Autowired
    CustomDateEditor dateEditor;

    @RequestMapping(value = "campaign/new", method = RequestMethod.GET)
    public String showForm(Map<String, Object> model) {
        //List<Campaign> campaigns = campaignManager.getCampaigns();
        Campaign campaignForm = new Campaign();
        CampaignCities cities = new CampaignCities();
        cities.setCities(new HashSet<City>(cityManager.getCity()));
        //campaignForm.setCities(cities);
        model.put("campaignCities", cities);
        model.put("campaign", campaignForm);
        return "campaign/new";
    }

    @RequestMapping(value = "campaign/new", method = RequestMethod.POST)
    public String processForm(@Valid Campaign campaignForm, BindingResult result, Map<String,Object> model) {
        new CampaignValidator().validate(campaignForm, result);
        if (result.hasErrors()) {
            return "campaign/new";
        }
        this.campaignManager.saveCampaign(campaignForm);
        model.put("campaign", campaignForm);
        model.put("campaigns", this.campaignManager.getCampaigns());
        return "campaign/added";
    }
@SessionAttributes(值={“活动”、“活动城市”})
@控制器
公共类控制器{
//私有静态最终记录器Logger=LoggerFactory.getLogger(NewDealController.class);
@自动连线
私人竞选经理;
@自动连线
私人城市管理人城市管理人;
@自动连线
SimpleDataFormat日期格式;
@自动连线
自定义日期编辑器;
@RequestMapping(value=“campaign/new”,method=RequestMethod.GET)
公共字符串显示表单(地图模型){
//列出活动=活动管理器。getCampaigns();
活动形式=新活动();
活动城市=新活动城市();
cities.setCities(新的HashSet(cityManager.getCity());
//活动形式:setCities(城市);
模型。put(“活动城市”,城市);
示范投入(“活动”,活动形式);
返回“活动/新”;
}
@RequestMapping(value=“campaign/new”,method=RequestMethod.POST)
公共字符串processForm(@Valid Campaign campaignForm,BindingResult结果,映射模型){
新的活动验证器().validate(活动表单、结果);
if(result.hasErrors()){
返回“活动/新”;
}
此.campaignManager.saveCampaign(活动表单);
示范投入(“活动”,活动形式);
model.put(“活动”,this.campaigmanager.getcampaigments());
返回“活动/添加”;
}
我已经能够以一种形式呈现活动,并且我已经使用以下方法成功呈现了城市列表:

<form:checkboxes items="${campaignCities.cities}" path="cities" itemLabel="name" itemValue="id" delimiter="<br/>" />

但是,当我提交表单时,我得到以下验证错误

字段“cities”上的对象“campaign”中的字段错误:值被拒绝 [2,1];代码 [typeMismatch.campaign.cities,typeMismatch.cities,typeMismatch.com.groupdealclone.app.domain.CampaignCities,typeMismatch]; 论据 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码[活动.城市,城市];参数[];默认消息 [城市]];默认消息[无法转换类型的属性值] “java.lang.String[]”转换为所需类型 房地产“城市”的“com.groupdealclone.app.domain.activationcities”; 嵌套异常为java.lang.IllegalStateException:无法转换 将[java.lang.String[]]类型的值转换为所需类型 [com.groupdealclone.app.domain.CampaignCities]用于属性“cities”: 找不到匹配的编辑器或转换策略]

我曾试图在SpringMVC 3中找到一种方法来处理这个问题,但我已经被困了一天多,没有成功。我只是想要一个列表或集合或城市,在表单上检查这些城市,然后提交给管理员并添加到活动中。我如何解决转换问题,在那里我可以转换字符串[]返回到一个列表或一组城市


我正在处理的项目是一个公共GitHub项目,如果您喜欢,可以下载源代码并使用Maven进行设置。该项目被称为

,经过将近2天的时间,答案比我预期的要简单。多亏我被引导到了答案

在我的新活动中,我做到了:

@InitBinder
public void initBinder(WebDataBinder binder) {
    dateFormat.setLenient(false);
    binder.registerCustomEditor(Date.class, dateEditor);

    binder.registerCustomEditor(CampaignCities.class, "cities", new PropertyEditorSupport() {
        @Override
        public void setAsText(String text) {
            String [] ids = text.split(",");
            CampaignCities cities = null;
            for(String id:ids){
                if(cities == null)
                    cities = new CampaignCities();
                City city = cityManager.getCity(new Long(id));
                if(city != null)
                    cities.getCities().add(city);

            }
            if(cities != null){
                cities.setId(null);
                setValue(cities);
            }
        }
    });