This is my first question, but I have been looking for a solution for 2 days, with no success. In my project, I have a User
entity with a transient property:
@Transient
@JsonProperty
private List<String> files;
I have no setter, and getter is:
public List<String> getFiles() {
/* Call one static method */
}
Executing the application with NetBeans in debug, works fine, and from javascript, I can get the getFiles results, using user.fotos
. But when I generate .jar file, and I execute the application with command java -jar app.jar
, by calling one Rest function that must return one User
object, I get this exception:
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"])
My question is: What is Netbeans doing different from command line java -jar, which makes it work fine?
Trying to find some documentation more, I found this: JPA Transient Annotation and JSON
Thanks to Damien, finally I have my project working fine: Main Application.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);
}
}
User entity Class:
@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 interface:
@RepositoryRestResource(collectionResourceRel = "users", itemResourceRel = "users")
public interface UserDAO extends JpaRepository<User, Long> {
}
UserController:
@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:
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);
}
});
}
The result is that javascript show me an alert with the file names that exists on the server.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.