【问题标题】:Spring-boot + Hibernate + JPA with transient fields带有瞬态字段的 Spring-boot + Hibernate + JPA
【发布时间】:2016-01-28 08:45:38
【问题描述】:

这是我的第一个问题,但我一直在寻找解决方案 2 天,但没有成功。 在我的项目中,我有一个具有瞬态属性的 User 实体:

@Transient
@JsonProperty
private List<String> files;

我没有setter,getter是:

public List<String> getFiles() {
    /* Call one static method */
}

在调试中使用 NetBeans 执行应用程序,工作正常,并且通过 javascript,我可以使用 user.fotos 获取 getFiles 结果。但是,当我生成 .jar 文件并使用命令 java -jar app.jar 执行应用程序时,通过调用一个必须返回一个 User 对象的 Rest 函数,我得到了这个异常:

2015-10-28 14:39:35.963  WARN 27836 --- [nio-7777-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: (was java.lang.NullPointerException) (through reference chain: com.pfc.soriano.wsdbmodel.entity.User["files"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.pfc.soriano.wsdbmodel.entity.User["files"])
2015-10-28 14:39:35.963  WARN 27836 --- [nio-7777-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Handler execution resulted in exception: Could not write content: (was java.lang.NullPointerException) (through reference chain: com.pfc.soriano.wsdbmodel.entity.User["files"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.pfc.soriano.wsdbmodel.entity.User["files"])

我的问题是:Netbeans 与命令行 java -jar 有什么不同,这使它可以正常工作?

【问题讨论】:

  • 所以你得到了一个 NPE,并且?只有你知道那是什么代码的哪一行...
  • 你需要知道什么,尼尔?从方法 getFiles(),我调用了一个静态方法:public static Collection&lt;String&gt; getImages(String prefix, String path) { List&lt;String&gt; result = new ArrayList&lt;&gt;(); File directorio = new File(path); TruequeFiltro filtro = new TruequeFiltro(prefix); for (File file : directorio.listFiles(filtro)) { result.add(file.getName()); } return result; }
  • 你有一个 NPE,所以找出哪一行,然后找出 WHAT 为空,然后修复它。
  • 我不需要做任何事情来获得 NPE。我有一个用户控制器,带有@Autowired UserDao userDao; 和这个方法:` @RequestMapping(value = "findById", method = RequestMethod.POST) @ResponseBody public User findById(@Param("id") Long id) { return userDao.findOne (ID); } . UserDao is defined as: @RepositoryRestResource(collectionResourceRel = "users", itemResourceRel = "users") public interface UserDao extends JpaRepository { `当我使用 ajax 从 javascript 调用 findById 方法时,我得到出现在我的第一条评论。
  • 如果我使用 netbeans 运行应用程序,一切正常。如果我使用java -jar app.jar 命令运行应用程序,则没有任何效果。如果我删除瞬态字段files 和getter 和setter,使用netbeans 或命令行一切正常。

标签: java spring hibernate jpa netbeans


【解决方案1】:

试图找到更多的文档,我发现了这个:JPA Transient Annotation and JSON

感谢 Damien,我的项目终于可以正常运行了: 主应用程序.java:

@SpringBootApplication
public class Application extends WebMvcConfigurerAdapter {

    /* Here we register the Hibernate4Module into an ObjectMapper, then set this custom-configured ObjectMapper
     * to the MessageConverter and return it to be added to the HttpMessageConverters of our application*/
    public MappingJackson2HttpMessageConverter jacksonMessageConverter() {
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

        ObjectMapper mapper = new ObjectMapper();
        Hibernate4Module hm = new Hibernate4Module();
        hm.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
        mapper.registerModule(hm);

        messageConverter.setObjectMapper(mapper);
        return messageConverter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(jacksonMessageConverter());
        super.configureMessageConverters(converters);
    }

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

用户实体类:

@Entity
@Table(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;
    @Transient
    Collection<String> files;

    public Long getId() {
        files = Utils.getImages("" + id, "src/main/webapp/user/");
        return id;
    }

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

    public Collection<String> getFiles() {
        return files;
    }

    public void setFiles(Collection<String> files) {
        this.files = files;
    }
}

UserDAO 接口:

@RepositoryRestResource(collectionResourceRel = "users", itemResourceRel = "users")
public interface UserDAO extends JpaRepository<User, Long> {

}

用户控制器:

@Controller
@RequestMapping(value = "user")
public class UserController {

    @Autowired
    UserDAO userDAO;

    @RequestMapping(value = "findById", method = RequestMethod.POST)
    @ResponseBody
    public User findById(@Param("id") Long id) {
        return userDAO.findOne(id);
    }
}

Javascript 函数:

function loadUser(id) {
    $.ajax({
        type: "POST",
        url: serviceBaseUrl + "user/findById",
        data: {id: id},
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        success: function (data, textStatus, jqXHR) {
            if(data) {
                alert(data.files);
                /* DO SOMETHING ELSE */
            }
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(jqXHR.responseJSON.message);
        }
    });
}

结果是 javascript 向我显示一个警报,其中包含服务器上存在的文件名。

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多