I’m trying to work with REST api and after creating JSON post call, null value is written to the database instead of the value that was written in JSON.
I am working with PostgreSQL database.
After I send JSON using Postman or Swagger I get Server Response Code: 200. But the database writes the color as null.
EXAMPLE:
JSON:
{ "color": "string" }
Server response:
{ "id": 2, "color": null }
connection: keep-alive content-type: application/json date: Thu06 Oct 2022 13:27:09 GMT keep-alive: timeout=60 transfer-encoding: chunked
I added here also application.properties file if I accidentally made some mistake already directly in it.
Project structure:
- controller
- dto
- model
- repository
- service
application.properties
spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://localhost/democalendareventapp spring.datasource.username=postgres spring.datasource.password=postgres spring.jpa.generate-dll=true spring.datasource.hikari.maximumPoolSize=2 spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect #spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true spring.mvc.pathmatch.matching-strategy=ant_path_matcher
model: EventCategoryColor
package com.radocode.DemoCalendarEventApp.model; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.*; @Entity @NoArgsConstructor @Data @Table(name = "EventCategoryColor") public class EventCategoryColor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String color; public EventCategoryColor(String color) { this.color = color; } }
repository: EventCategoryColorRepository
package com.radocode.DemoCalendarEventApp.repository; import com.radocode.DemoCalendarEventApp.model.EventCategoryColor; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @Repository public interface EventCategoryColorRepository extends CrudRepository<EventCategoryColor, Long> { }
service – Interface: EventCategoryColorService
package com.radocode.DemoCalendarEventApp.service; import com.radocode.DemoCalendarEventApp.dto.requestDto.EventCategoryColorRequestDto; import com.radocode.DemoCalendarEventApp.model.EventCategoryColor; import org.springframework.stereotype.Service; import java.util.List; @Service public interface EventCategoryColorService { public EventCategoryColor addColor(EventCategoryColorRequestDto eventCategoryColorRequestDto); public List<EventCategoryColor> getColors(); public EventCategoryColor getColor(Long id); public EventCategoryColor deleteColor(Long id); public EventCategoryColor editColor(Long id, EventCategoryColorRequestDto eventCategoryColorRequestDto); }
service: EventCategoryColorServiceImp
package com.radocode.DemoCalendarEventApp.service; import com.radocode.DemoCalendarEventApp.dto.requestDto.EventCategoryColorRequestDto; import com.radocode.DemoCalendarEventApp.model.EventCategoryColor; import com.radocode.DemoCalendarEventApp.repository.EventCategoryColorRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.ArrayList; import java.util.List; @Service public class EventCategoryColorServiceImpl implements EventCategoryColorService { private final EventCategoryColorRepository eventCategoryColorRepository; @Autowired public EventCategoryColorServiceImpl(EventCategoryColorRepository eventCategoryColorRepository) { this.eventCategoryColorRepository = eventCategoryColorRepository; } @Override public EventCategoryColor addColor(EventCategoryColorRequestDto eventCategoryColorRequestDto) { EventCategoryColor eventCategoryColor = new EventCategoryColor(); eventCategoryColor.setColor(eventCategoryColor.getColor()); return eventCategoryColorRepository.save(eventCategoryColor); } @Override public List<EventCategoryColor> getColors() { List<EventCategoryColor> colors = new ArrayList<>(); eventCategoryColorRepository.findAll().forEach(colors::add); return colors; } @Override public EventCategoryColor getColor(Long id) { return eventCategoryColorRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Color with Id: " + id + ", could not be found")); } @Override public EventCategoryColor deleteColor(Long id) { EventCategoryColor eventCategoryColor = getColor(id); eventCategoryColorRepository.delete(eventCategoryColor); return eventCategoryColor; } @Transactional @Override public EventCategoryColor editColor(Long id, EventCategoryColorRequestDto eventCategoryColorRequestDto) { EventCategoryColor colorToEdit = getColor(id); colorToEdit.setColor(eventCategoryColorRequestDto.getColor()); return colorToEdit; } }
dto: EventCategoryColorRequestDto
package com.radocode.DemoCalendarEventApp.dto.requestDto; import lombok.Data; @Data public class EventCategoryColorRequestDto { private String color; }
controller: EventCategoryColorController
package com.radocode.DemoCalendarEventApp.controller; import com.radocode.DemoCalendarEventApp.dto.requestDto.EventCategoryColorRequestDto; import com.radocode.DemoCalendarEventApp.model.EventCategoryColor; import com.radocode.DemoCalendarEventApp.service.EventCategoryColorService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/event-category-color") public class EventCatogeryColorController { private final EventCategoryColorService eventCategoryColorService; @Autowired public EventCatogeryColorController(EventCategoryColorService eventCategoryColorService) { this.eventCategoryColorService = eventCategoryColorService; } @PostMapping("/add") public ResponseEntity<EventCategoryColor> addColor( @RequestBody final EventCategoryColorRequestDto eventCategoryColorRequestDto) { EventCategoryColor eventCategoryColor = eventCategoryColorService.addColor(eventCategoryColorRequestDto); return new ResponseEntity<>(eventCategoryColor, HttpStatus.OK); } @GetMapping("/get/{id}") public ResponseEntity<EventCategoryColor> getColorById(@PathVariable final Long id) { EventCategoryColor eventCategoryColor = eventCategoryColorService.getColor(id); return new ResponseEntity<>(eventCategoryColor, HttpStatus.OK); } @GetMapping("/get-all") public ResponseEntity<List<EventCategoryColor>> getColors() { List<EventCategoryColor> eventCategoryColors = eventCategoryColorService.getColors(); return new ResponseEntity<>(eventCategoryColors, HttpStatus.OK); } @DeleteMapping("/delete/{id}") public ResponseEntity<EventCategoryColor> deleteColor(@PathVariable final Long id) { EventCategoryColor eventCategoryColor = eventCategoryColorService.deleteColor(id); return new ResponseEntity<>(eventCategoryColor, HttpStatus.OK); } @PutMapping("/edit/{id}") public ResponseEntity<EventCategoryColor> editColor( @PathVariable final Long id, @RequestBody final EventCategoryColorRequestDto eventCategoryColorRequestDto) { EventCategoryColor eventCategoryColor = eventCategoryColorService.editColor(id, eventCategoryColorRequestDto); return new ResponseEntity<>(eventCategoryColor, HttpStatus.OK); } }
Advertisement
Answer
You set theo color value from the newly created entity to the entity which is not initialized at this time:
@Override public EventCategoryColor addColor(EventCategoryColorRequestDto eventCategoryColorRequestDto) { EventCategoryColor eventCategoryColor = new EventCategoryColor(); eventCategoryColor.setColor(eventCategoryColor.getColor()); return eventCategoryColorRepository.save(eventCategoryColor); }
should be:
@Override public EventCategoryColor addColor(EventCategoryColorRequestDto eventCategoryColorRequestDto) { EventCategoryColor eventCategoryColor = new EventCategoryColor(); eventCategoryColor.setColor(eventCategoryColorRequestDto.getColor()); return eventCategoryColorRepository.save(eventCategoryColor); }