当前位置: 首页 > 知识库问答 >
问题:

尝试在Spring+Thymeleaf中创建复合jpa对象

王辉
2023-03-14

我尝试创建一个对象,其中包含另一个对象,使用一个窗体,但是从下拉列表中选择的对象在从Thymeleaf窗体返回时会转换为字符串。这些是我的项目中的实体,它们之间具有1:N的关系:

实体用户

//imports
@Entity
@Table(name = "USERS")
public class User {
    @Id
    @GeneratedValue
    @Column( name ="USER_ID")
    private int id;

    @Column( name ="username")
    private String username;

    @Column( name ="password")
    private String password;

    @Column( name ="email")
    private String email;

    @OneToMany(fetch= FetchType.LAZY, mappedBy="user", cascade = CascadeType.ALL)
    private List<Post> posts;

    //setter & getters & toString

}

实体员额

//imports
@Entity
@Table(name="POSTS")
public class Post {
@Id
@GeneratedValue
@Column(name="POST_ID")
private int id;

@Column(name="tittle")
private String tittle;



@Column(name="text")
private String text;

@ManyToOne
@JoinColumn(name="USER_ID",referencedColumnName="USER_ID")
private User user;

//getters & setters & toString

要创建新职位,请执行以下操作:

//In Controller

@RequestMapping(value = "/posts/new")
public String newPost(Model model) {
    model.addAttribute("post", new Post());
    model.addAttribute("users", userService.list());
    return "addPost";       
}
<form th:action="@{/savePost}" th:object="${post}" method="post">
            <tr>
                <td><input type="hidden" th:field="${post.id}" /></td>
            </tr>
            <tr>
                <td>Titulo</td>
                <td>Texto</td>
                <td>Usuario</td>
            </tr>
            <tr>
                <td><input type="text" th:field="${post.tittle}"
                    th:value="${post.tittle}" /></td>
                <td><input type="text" th:field="${post.text}"
                    th:value="${post.text}" /></td>

                <td><select th:field="${post.user}">
                        <option th:each="user : ${users}" th:text="${user.username}"
                            th:value="${user.id}"></option>
                </select></td>


            </tr>
            <tr>
                <td colspan="3"><input class="btn btn-primary" type="submit"
                    value="GUARDAR"></td>
            </tr>

        </form> 
@PostMapping("/savePost")
//@RequestMapping(value = "users/save",method = RequestMethod.POST)
public String savePost(@ModelAttribute Post post) {

    postService.add(post);
    return "redirect:/posts";
}
public class UserFormatter implements Formatter<User> {

@Autowired
@Qualifier("userService")
public GeneralService<User> userService;

@Override
public String print(User object, Locale locale) {
    return (object != null ? object.getUsername() : "");
}

@Override
public User parse(String text, Locale locale) throws ParseException {
    final Integer userId = Integer.parseInt(text);
    return userService.get(userId);
}

}

正在注册:

@SpringBootApplication
public class BootmvchibernateApplication implements WebMvcConfigurer{

 @SuppressWarnings("unchecked")
    @Override
    public void addFormatters(FormatterRegistry registry) {
      registry.addFormatter(new UserFormatter());
    }



public static void main(String[] args) {
    SpringApplication.run(BootmvchibernateApplication.class, args);
}

}

但是当尝试这种方法时,会发现下一个错误,这只是uppon访问/post/new指令(模板addPost不起作用):

模板分析过程中出错(模板:“class path resource[templates/addpost2.html]”)org.thymeleaf.exceptions.templateInputException:模板分析过程中出错(模板:“class path resource[templates/addpost2.html]”).....原因:org.attoparser.ParseException:执行处理器“org.thymeleaf.spring5.processor.springOptionFieldTagProcessor”(模板:“AddPost2”-第43行,第8栏)时出错.....原因:org.springframework.core.convert.ConversionFailedException:无法将值“%2”从类型[java.lang.String]转换为类型[@javax.persistence.ManyToOne@javax.persistence.JoinColumn com.julian.bootmvchibernate.model.user];嵌套异常是org.springframework.core.convert.support.conversionutils.InvokeConverter(conversionutils.java:47)处的java.lang.NullPointerException

如果需要更多的信息,告诉我,我贴出来。编辑:如果有人感兴趣,这就是存储库。github.com/julianbautistavelez/jpa_spring_excercise

共有1个答案

闻人景澄
2023-03-14

问题出在您的addpost.html中,只是现在一切正常。

    <table>
        <form th:action="@{/posts/new/mod}" th:object="${post}"
            method="POST">
            <tr>
                <td><input type="hidden" th:field="${post.id}" /></td>
            </tr>
            <tr>
                <td>Titulo</td>
                <td>Texto</td>
                <td>Usuario</td>
            </tr>
            <tr>
                <td><input type="text" th:field="${post.tittle}"
                    th:value="${post.tittle}" /></td>
                <td><input type="text" th:field="${post.text}"
                    th:value="${newPost.text}" /></td>

                <!-- <td><select th:field="${newPost.user}">
                        <option th:each="user : ${users}" th:text="${user.username}"
                            th:value="${user.id}"></option>
                </select></td> -->

                <td><select th:field="*{user}" class="form-control">
                    <option th:each="user: ${users}"
                        th:value="${user.id}" th:text="${user.username}"></option>
                </select></td>


            </tr>
            <tr>
                <td colspan="3"><input class="btn btn-primary" type="submit"
                    value="GUARDAR"></td>
            </tr>

        </form>
    </table>

我将newpost更改为post,因为您在这里添加的是post模型。

@RequestMapping(value = "/posts/new")
public String newPost(Model model) {
    logger.info("-- en NEW Usuario");
    model.addAttribute("post", new Post());
    model.addAttribute("users", userService.list());
    logger.info("-- -- -- LISTA DE USUARIOS -- -- --");
    System.out.println(userService.list());
    return "addPost";       
}
 类似资料:
  • 我不知道我做得是否正确,但我正在创建一个应用程序,为高中毕业舞会分配门票,对于每个学生,我让学校放入ID中,因为所有学生在该学校都有一个唯一的ID,并作为密钥存储。但问题是,不同学校的两个学生可能有相同的ID,所以我打算将主密钥存储为学生ID和学校ID。这是我的学生实体类。 beanCreationException:创建类路径资源[org/springframework/boot/autocon

  • 问题内容: 我想要具有来自同一数据条目的版本。换句话说,我想用另一个版本号复制该条目。 将是主键。 实体看起来如何?如何将其复制到另一个版本? 问题答案: 你可以制作一个,其中包含两个键,然后像中一样引用该类Entity。 你将需要和注释。 完成此任务的另一种方法是使用@IdClass批注,然后将两者都id放在该批注中IdClass。现在你可以@Id在两个属性上使用普通注释

  • 实体应该是什么样子的?我如何用另一个版本复制它?

  • 当我尝试创建一个新的OkHttpClient对象时,会引发一个异常 我使用的是OkHttp 3.11.0和OkIO 2.0.0-RC1。

  • 根据文档,我应该能够在标题中包含CSRF令牌,使用jquery获取它们,并将它们包含在ajax调用的标题中。 不幸的是,包括 输出: 而且不是真正的代币,所以没有什么可抢的。 有没有人用这种方式处理ajax帖子/放置/删除成功? 参考号:http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/